zapo-js 0.3.0 → 1.0.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 (774) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -177
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  4. package/dist/appstate/index.js +7 -6
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +100 -5
  11. package/dist/auth/credentials-flow.js +19 -7
  12. package/dist/auth/pairing/WaPairingFlow.js +33 -24
  13. package/dist/auth/pairing/pairing-code-crypto.js +16 -18
  14. package/dist/client/WaClient.js +342 -473
  15. package/dist/client/WaClientFactory.js +279 -78
  16. package/dist/client/connection/WaConnectionManager.js +28 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
  22. package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +682 -204
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
  30. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  31. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  32. package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
  33. package/dist/client/coordinators/WaRetryCoordinator.js +256 -125
  34. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  35. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  36. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  37. package/dist/client/events/appstate-mutation.js +133 -0
  38. package/dist/client/events/business.js +375 -0
  39. package/dist/client/events/call.js +58 -0
  40. package/dist/client/events/chatstate.js +23 -0
  41. package/dist/client/events/devices.js +15 -16
  42. package/dist/client/{dirty.js → events/dirty.js} +33 -19
  43. package/dist/client/events/group.js +13 -24
  44. package/dist/client/events/identity.js +2 -1
  45. package/dist/client/events/incoming.js +502 -0
  46. package/dist/client/events/mex-notification.js +181 -0
  47. package/dist/client/events/picture.js +33 -0
  48. package/dist/client/events/presence.js +44 -0
  49. package/dist/client/events/receipt.js +26 -0
  50. package/dist/client/media.js +161 -4
  51. package/dist/client/messaging/fanout.js +9 -10
  52. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  53. package/dist/client/messaging/ignore-key.js +132 -0
  54. package/dist/client/messaging/key-protocol.js +3 -17
  55. package/dist/client/messaging/link-preview.js +159 -0
  56. package/dist/client/messaging/messages.js +671 -0
  57. package/dist/client/newsletter/admin.js +165 -0
  58. package/dist/client/newsletter/content.js +253 -0
  59. package/dist/client/newsletter/discovery.js +115 -0
  60. package/dist/client/newsletter/messaging.js +197 -0
  61. package/dist/client/newsletter/mex.js +41 -0
  62. package/dist/client/newsletter/parse.js +217 -0
  63. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  64. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  65. package/dist/client/persistence/mailbox.js +104 -0
  66. package/dist/client/tokens/cs-token.js +11 -17
  67. package/dist/crypto/core/hkdf.js +12 -12
  68. package/dist/crypto/core/index.js +6 -8
  69. package/dist/crypto/core/keys.js +1 -8
  70. package/dist/crypto/core/nonce.js +12 -12
  71. package/dist/crypto/core/primitives.js +123 -93
  72. package/dist/crypto/core/random.js +6 -0
  73. package/dist/crypto/core/xeddsa.js +11 -9
  74. package/dist/crypto/curves/Ed25519.js +32 -21
  75. package/dist/crypto/curves/X25519.js +70 -34
  76. package/dist/crypto/curves/constants.js +2 -1
  77. package/dist/crypto/math/constants.js +1 -2
  78. package/dist/crypto/math/mod.js +0 -33
  79. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  80. package/dist/esm/appstate/index.js +5 -5
  81. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  82. package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  83. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
  84. package/dist/esm/appstate/utils.js +16 -0
  85. package/dist/esm/appstate-spec.js +79 -0
  86. package/dist/esm/auth/WaAuthClient.js +100 -5
  87. package/dist/esm/auth/credentials-flow.js +18 -6
  88. package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
  89. package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
  90. package/dist/esm/client/WaClient.js +345 -476
  91. package/dist/esm/client/WaClientFactory.js +280 -79
  92. package/dist/esm/client/connection/WaConnectionManager.js +28 -11
  93. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
  94. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  95. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  96. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  97. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
  98. package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
  99. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  100. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
  101. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  102. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  103. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
  104. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  105. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
  106. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  107. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  108. package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
  109. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
  110. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  111. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  112. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  113. package/dist/esm/client/events/appstate-mutation.js +130 -0
  114. package/dist/esm/client/events/business.js +370 -0
  115. package/dist/esm/client/events/call.js +55 -0
  116. package/dist/esm/client/events/chatstate.js +20 -0
  117. package/dist/esm/client/events/devices.js +15 -16
  118. package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
  119. package/dist/esm/client/events/group.js +14 -25
  120. package/dist/esm/client/events/identity.js +2 -1
  121. package/dist/esm/client/events/incoming.js +487 -0
  122. package/dist/esm/client/events/mex-notification.js +178 -0
  123. package/dist/esm/client/events/picture.js +30 -0
  124. package/dist/esm/client/events/presence.js +41 -0
  125. package/dist/esm/client/events/receipt.js +23 -0
  126. package/dist/esm/client/media.js +156 -6
  127. package/dist/esm/client/messaging/fanout.js +10 -11
  128. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  129. package/dist/esm/client/messaging/ignore-key.js +126 -0
  130. package/dist/esm/client/messaging/key-protocol.js +3 -17
  131. package/dist/esm/client/messaging/link-preview.js +156 -0
  132. package/dist/esm/client/messaging/messages.js +667 -0
  133. package/dist/esm/client/newsletter/admin.js +162 -0
  134. package/dist/esm/client/newsletter/content.js +249 -0
  135. package/dist/esm/client/newsletter/discovery.js +112 -0
  136. package/dist/esm/client/newsletter/messaging.js +194 -0
  137. package/dist/esm/client/newsletter/mex.js +37 -0
  138. package/dist/esm/client/newsletter/parse.js +200 -0
  139. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  140. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  141. package/dist/esm/client/persistence/mailbox.js +101 -0
  142. package/dist/esm/client/tokens/cs-token.js +12 -18
  143. package/dist/esm/crypto/core/hkdf.js +14 -14
  144. package/dist/esm/crypto/core/index.js +2 -2
  145. package/dist/esm/crypto/core/keys.js +1 -7
  146. package/dist/esm/crypto/core/nonce.js +11 -11
  147. package/dist/esm/crypto/core/primitives.js +121 -88
  148. package/dist/esm/crypto/core/random.js +6 -0
  149. package/dist/esm/crypto/core/xeddsa.js +11 -9
  150. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  151. package/dist/esm/crypto/curves/X25519.js +72 -36
  152. package/dist/esm/crypto/curves/constants.js +1 -0
  153. package/dist/esm/crypto/math/constants.js +1 -2
  154. package/dist/esm/crypto/math/mod.js +0 -32
  155. package/dist/esm/index.js +7 -2
  156. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  157. package/dist/esm/infra/log/PinoLogger.js +64 -0
  158. package/dist/esm/infra/log/types.js +4 -2
  159. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  160. package/dist/esm/media/constants.js +33 -2
  161. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  162. package/dist/esm/media/index.js +4 -3
  163. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  164. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  165. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  166. package/dist/esm/message/WaMessageClient.js +46 -15
  167. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  168. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  169. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  170. package/dist/esm/message/addons/link-preview/types.js +1 -0
  171. package/dist/esm/message/context-info.js +123 -0
  172. package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  173. package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
  174. package/dist/esm/message/crypto/phash.js +133 -0
  175. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  176. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  177. package/dist/esm/message/{content.js → encode/content.js} +176 -7
  178. package/dist/esm/message/encode/media-payload.js +42 -0
  179. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  180. package/dist/esm/message/index.js +2 -2
  181. package/dist/esm/message/kinds/bot.js +111 -0
  182. package/dist/esm/message/kinds/newsletter.js +244 -0
  183. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  184. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  185. package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
  186. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  187. package/dist/esm/mex.js +1 -0
  188. package/dist/esm/protocol/abprops.js +10 -0
  189. package/dist/esm/protocol/appstate.js +6 -30
  190. package/dist/esm/protocol/auth.js +3 -2
  191. package/dist/esm/protocol/bot.js +77 -0
  192. package/dist/esm/protocol/browser.js +8 -0
  193. package/dist/esm/protocol/business.js +19 -0
  194. package/dist/esm/protocol/call.js +48 -0
  195. package/dist/esm/protocol/constants.js +8 -2
  196. package/dist/esm/protocol/defaults.js +3 -0
  197. package/dist/esm/protocol/index.js +1 -1
  198. package/dist/esm/protocol/jid.js +102 -5
  199. package/dist/esm/protocol/media.js +25 -12
  200. package/dist/esm/protocol/message.js +4 -1
  201. package/dist/esm/protocol/newsletter.js +61 -0
  202. package/dist/esm/protocol/nodes.js +22 -2
  203. package/dist/esm/protocol/notification.js +18 -2
  204. package/dist/esm/protocol/presence.js +13 -0
  205. package/dist/esm/protocol/status.js +6 -0
  206. package/dist/esm/retry/codec.js +5 -0
  207. package/dist/esm/retry/parse.js +20 -38
  208. package/dist/esm/retry/reason.js +5 -0
  209. package/dist/esm/retry/replay.js +131 -37
  210. package/dist/esm/retry/tracker.js +4 -8
  211. package/dist/esm/signal/api/SignalDeviceSyncApi.js +66 -19
  212. package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
  213. package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
  214. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  215. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  216. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  217. package/dist/esm/signal/api/codec.js +52 -1
  218. package/dist/esm/signal/api/prekeys.js +4 -0
  219. package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
  220. package/dist/esm/signal/constants.js +3 -0
  221. package/dist/esm/signal/encoding.js +6 -289
  222. package/dist/esm/signal/group/SenderKeyChain.js +18 -33
  223. package/dist/esm/signal/group/SenderKeyManager.js +25 -8
  224. package/dist/esm/signal/group/encoding.js +96 -0
  225. package/dist/esm/signal/index.js +4 -1
  226. package/dist/esm/signal/registration/encoding.js +34 -0
  227. package/dist/esm/signal/registration/keygen.js +10 -0
  228. package/dist/esm/signal/registration/utils.js +6 -0
  229. package/dist/esm/signal/session/SignalProtocol.js +113 -11
  230. package/dist/esm/signal/session/SignalRatchet.js +29 -58
  231. package/dist/esm/signal/session/SignalSession.js +7 -14
  232. package/dist/esm/signal/session/encoding.js +173 -0
  233. package/dist/esm/signal/session/resolver.js +139 -30
  234. package/dist/esm/store/cache/identity.cache.js +75 -0
  235. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  236. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  237. package/dist/esm/store/cache/session.cache.js +92 -0
  238. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  239. package/dist/esm/store/createStore.js +91 -37
  240. package/dist/esm/store/index.js +15 -14
  241. package/dist/esm/store/locks/contact.lock.js +1 -0
  242. package/dist/esm/store/locks/device-list.lock.js +1 -0
  243. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  244. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  245. package/dist/esm/store/memory/auth.store.js +24 -0
  246. package/dist/esm/store/memory/contact.store.js +79 -0
  247. package/dist/esm/store/memory/device-list.store.js +103 -0
  248. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
  249. package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
  250. package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
  251. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  252. package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
  253. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  254. package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
  255. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  256. package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
  257. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  258. package/dist/esm/store/noop.store.js +6 -4
  259. package/dist/esm/transport/WaComms.js +14 -5
  260. package/dist/esm/transport/WaWebSocket.js +32 -8
  261. package/dist/esm/transport/binary/constants.js +10 -4
  262. package/dist/esm/transport/binary/decoder.js +21 -15
  263. package/dist/esm/transport/binary/encoder.js +96 -21
  264. package/dist/esm/transport/binary/tokens.js +12 -12
  265. package/dist/esm/transport/index.js +1 -0
  266. package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
  267. package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
  268. package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
  269. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  270. package/dist/esm/transport/node/builders/abprops.js +2 -2
  271. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  272. package/dist/esm/transport/node/builders/bot.js +38 -0
  273. package/dist/esm/transport/node/builders/business.js +30 -30
  274. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  275. package/dist/esm/transport/node/builders/community.js +53 -0
  276. package/dist/esm/transport/node/builders/device.js +2 -2
  277. package/dist/esm/transport/node/builders/email.js +6 -5
  278. package/dist/esm/transport/node/builders/global.js +1 -1
  279. package/dist/esm/transport/node/builders/group.js +114 -4
  280. package/dist/esm/transport/node/builders/media.js +2 -2
  281. package/dist/esm/transport/node/builders/message.js +83 -49
  282. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  283. package/dist/esm/transport/node/builders/passive.js +7 -0
  284. package/dist/esm/transport/node/builders/prekeys.js +4 -4
  285. package/dist/esm/transport/node/builders/presence.js +27 -1
  286. package/dist/esm/transport/node/builders/privacy-token.js +2 -2
  287. package/dist/esm/transport/node/builders/privacy.js +6 -6
  288. package/dist/esm/transport/node/builders/profile.js +28 -8
  289. package/dist/esm/transport/node/builders/tos.js +58 -0
  290. package/dist/esm/transport/node/builders/usync.js +51 -2
  291. package/dist/esm/transport/node/helpers.js +3 -1
  292. package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
  293. package/dist/esm/transport/node/mex/client.js +22 -0
  294. package/dist/esm/transport/node/query.js +17 -0
  295. package/dist/esm/transport/node/usync.js +12 -0
  296. package/dist/esm/transport/noise/WaClientPayload.js +8 -8
  297. package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
  298. package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
  299. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  300. package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
  301. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  302. package/dist/esm/transport/noise/constants.js +0 -1
  303. package/dist/esm/transport/proxy.js +5 -0
  304. package/dist/esm/transport/stream/parse.js +3 -7
  305. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  306. package/dist/esm/util/async.js +4 -0
  307. package/dist/esm/util/bytes.js +37 -2
  308. package/dist/esm/util/clock.js +15 -0
  309. package/dist/esm/util/coercion.js +45 -3
  310. package/dist/esm/util/collections.js +11 -0
  311. package/dist/esm/util/index.js +2 -2
  312. package/dist/esm/util/primitives.js +19 -0
  313. package/dist/esm/util/runtime.js +5 -0
  314. package/dist/esm/version-spec.js +1 -0
  315. package/dist/index.js +31 -1
  316. package/dist/infra/log/ConsoleLogger.js +30 -6
  317. package/dist/infra/log/PinoLogger.js +64 -0
  318. package/dist/infra/log/types.js +4 -2
  319. package/dist/infra/perf/BackgroundQueue.js +55 -13
  320. package/dist/media/constants.js +34 -3
  321. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  322. package/dist/media/index.js +9 -4
  323. package/dist/media/sticker/sticker-pack.js +136 -0
  324. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  325. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  326. package/dist/message/WaMessageClient.js +46 -15
  327. package/dist/message/addons/link-preview/builder.js +39 -0
  328. package/dist/message/addons/link-preview/detect.js +58 -0
  329. package/dist/message/addons/link-preview/fetcher.js +394 -0
  330. package/dist/message/addons/link-preview/types.js +2 -0
  331. package/dist/message/context-info.js +129 -0
  332. package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  333. package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
  334. package/dist/message/crypto/phash.js +136 -0
  335. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  336. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  337. package/dist/message/{content.js → encode/content.js} +192 -7
  338. package/dist/message/encode/media-payload.js +45 -0
  339. package/dist/message/{padding.js → encode/padding.js} +9 -3
  340. package/dist/message/index.js +2 -2
  341. package/dist/message/kinds/bot.js +120 -0
  342. package/dist/message/kinds/newsletter.js +248 -0
  343. package/dist/message/kinds/sticker-pack.js +34 -0
  344. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  345. package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
  346. package/dist/message/primitives/peer-data-operation.js +96 -0
  347. package/dist/mex.js +6 -0
  348. package/dist/proto.js +1 -1
  349. package/dist/protocol/abprops.js +10 -0
  350. package/dist/protocol/appstate.js +7 -31
  351. package/dist/protocol/auth.js +3 -2
  352. package/dist/protocol/bot.js +81 -0
  353. package/dist/protocol/browser.js +8 -0
  354. package/dist/protocol/business.js +22 -0
  355. package/dist/protocol/call.js +51 -0
  356. package/dist/protocol/constants.js +39 -3
  357. package/dist/protocol/defaults.js +3 -0
  358. package/dist/protocol/index.js +12 -3
  359. package/dist/protocol/jid.js +107 -5
  360. package/dist/protocol/media.js +25 -12
  361. package/dist/protocol/message.js +4 -1
  362. package/dist/protocol/newsletter.js +64 -0
  363. package/dist/protocol/nodes.js +22 -2
  364. package/dist/protocol/notification.js +19 -3
  365. package/dist/protocol/presence.js +16 -0
  366. package/dist/protocol/status.js +9 -0
  367. package/dist/retry/codec.js +5 -0
  368. package/dist/retry/parse.js +16 -34
  369. package/dist/retry/reason.js +5 -0
  370. package/dist/retry/replay.js +129 -35
  371. package/dist/retry/tracker.js +3 -7
  372. package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
  373. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  374. package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
  375. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  376. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  377. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  378. package/dist/signal/api/codec.js +52 -0
  379. package/dist/signal/api/prekeys.js +4 -0
  380. package/dist/signal/{crypto → attestation}/WaAdvSignature.js +5 -7
  381. package/dist/signal/constants.js +4 -1
  382. package/dist/signal/encoding.js +5 -303
  383. package/dist/signal/group/SenderKeyChain.js +17 -32
  384. package/dist/signal/group/SenderKeyManager.js +24 -7
  385. package/dist/signal/group/encoding.js +101 -0
  386. package/dist/signal/index.js +13 -10
  387. package/dist/signal/registration/encoding.js +39 -0
  388. package/dist/signal/registration/keygen.js +10 -0
  389. package/dist/signal/registration/utils.js +6 -0
  390. package/dist/signal/session/SignalProtocol.js +112 -10
  391. package/dist/signal/session/SignalRatchet.js +24 -54
  392. package/dist/signal/session/SignalSession.js +6 -14
  393. package/dist/signal/session/encoding.js +183 -0
  394. package/dist/signal/session/resolver.js +139 -30
  395. package/dist/store/cache/identity.cache.js +78 -0
  396. package/dist/store/cache/privacy-token.cache.js +60 -0
  397. package/dist/store/cache/sender-key.cache.js +104 -0
  398. package/dist/store/cache/session.cache.js +95 -0
  399. package/dist/store/contracts/group-metadata.store.js +2 -0
  400. package/dist/store/createStore.js +90 -36
  401. package/dist/store/index.js +18 -16
  402. package/dist/store/locks/contact.lock.js +1 -0
  403. package/dist/store/locks/device-list.lock.js +1 -0
  404. package/dist/store/locks/group-metadata.lock.js +23 -0
  405. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  406. package/dist/store/memory/auth.store.js +28 -0
  407. package/dist/store/memory/contact.store.js +83 -0
  408. package/dist/store/memory/device-list.store.js +107 -0
  409. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
  410. package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
  411. package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
  412. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  413. package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
  414. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  415. package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
  416. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  417. package/dist/store/{providers/memory → memory}/session.store.js +3 -3
  418. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  419. package/dist/store/noop.store.js +7 -5
  420. package/dist/transport/WaComms.js +14 -5
  421. package/dist/transport/WaWebSocket.js +32 -8
  422. package/dist/transport/binary/constants.js +11 -5
  423. package/dist/transport/binary/decoder.js +24 -18
  424. package/dist/transport/binary/encoder.js +109 -34
  425. package/dist/transport/binary/tokens.js +12 -12
  426. package/dist/transport/index.js +3 -1
  427. package/dist/transport/keepalive/WaKeepAlive.js +18 -4
  428. package/dist/transport/node/WaMobileTcpSocket.js +6 -0
  429. package/dist/transport/node/WaNodeOrchestrator.js +9 -5
  430. package/dist/transport/node/WaNodeTransport.js +13 -0
  431. package/dist/transport/node/builders/abprops.js +1 -1
  432. package/dist/transport/node/builders/account-sync.js +7 -16
  433. package/dist/transport/node/builders/bot.js +43 -0
  434. package/dist/transport/node/builders/business.js +31 -31
  435. package/dist/transport/node/builders/chatstate.js +31 -0
  436. package/dist/transport/node/builders/community.js +59 -0
  437. package/dist/transport/node/builders/device.js +1 -1
  438. package/dist/transport/node/builders/email.js +6 -5
  439. package/dist/transport/node/builders/global.js +1 -1
  440. package/dist/transport/node/builders/group.js +121 -3
  441. package/dist/transport/node/builders/media.js +1 -1
  442. package/dist/transport/node/builders/message.js +84 -49
  443. package/dist/transport/node/builders/newsletter.js +183 -0
  444. package/dist/transport/node/builders/passive.js +10 -0
  445. package/dist/transport/node/builders/prekeys.js +3 -3
  446. package/dist/transport/node/builders/presence.js +28 -1
  447. package/dist/transport/node/builders/privacy-token.js +1 -1
  448. package/dist/transport/node/builders/privacy.js +5 -5
  449. package/dist/transport/node/builders/profile.js +30 -7
  450. package/dist/transport/node/builders/tos.js +63 -0
  451. package/dist/transport/node/builders/usync.js +52 -1
  452. package/dist/transport/node/helpers.js +2 -1
  453. package/dist/transport/node/mex/argo-decoder.js +2 -2
  454. package/dist/transport/node/mex/client.js +23 -0
  455. package/dist/transport/node/query.js +17 -0
  456. package/dist/transport/node/usync.js +13 -0
  457. package/dist/transport/noise/WaClientPayload.js +8 -8
  458. package/dist/transport/noise/WaMobileClientPayload.js +5 -0
  459. package/dist/transport/noise/WaNoiseCert.js +5 -0
  460. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  461. package/dist/transport/noise/WaNoiseSession.js +39 -59
  462. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  463. package/dist/transport/noise/constants.js +1 -2
  464. package/dist/transport/proxy.js +5 -0
  465. package/dist/transport/stream/parse.js +3 -7
  466. package/dist/transport/wa-web-version-fetcher.js +94 -0
  467. package/dist/types/appstate/constants.d.ts +1 -1
  468. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
  469. package/dist/types/appstate/index.d.ts +5 -5
  470. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  471. package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
  472. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  473. package/dist/types/appstate/utils.d.ts +17 -1
  474. package/dist/types/appstate-spec.d.ts +24 -0
  475. package/dist/types/auth/WaAuthClient.d.ts +89 -3
  476. package/dist/types/auth/credentials-flow.d.ts +4 -3
  477. package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
  478. package/dist/types/auth/types.d.ts +48 -1
  479. package/dist/types/client/WaClient.d.ts +178 -71
  480. package/dist/types/client/WaClientFactory.d.ts +30 -5
  481. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  482. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  483. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  484. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  485. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  486. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
  487. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
  488. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  489. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
  490. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  491. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  492. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +54 -31
  493. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  494. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
  495. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  496. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
  497. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
  498. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
  499. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  500. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
  501. package/dist/types/client/events/abprops.d.ts +2 -1
  502. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  503. package/dist/types/client/events/business.d.ts +10 -0
  504. package/dist/types/client/events/call.d.ts +31 -0
  505. package/dist/types/client/events/chatstate.d.ts +9 -0
  506. package/dist/types/client/events/devices.d.ts +5 -4
  507. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
  508. package/dist/types/client/events/group.d.ts +2 -1
  509. package/dist/types/client/events/identity.d.ts +2 -1
  510. package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
  511. package/dist/types/client/events/mex-notification.d.ts +6 -0
  512. package/dist/types/client/events/picture.d.ts +8 -0
  513. package/dist/types/client/events/presence.d.ts +28 -0
  514. package/dist/types/client/events/receipt.d.ts +14 -0
  515. package/dist/types/client/events/registration.d.ts +4 -3
  516. package/dist/types/client/index.d.ts +1 -1
  517. package/dist/types/client/media.d.ts +35 -1
  518. package/dist/types/client/messaging/fanout.d.ts +2 -2
  519. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  520. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  521. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  522. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  523. package/dist/types/client/messaging/messages.d.ts +28 -0
  524. package/dist/types/client/newsletter/admin.d.ts +71 -0
  525. package/dist/types/client/newsletter/content.d.ts +42 -0
  526. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  527. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  528. package/dist/types/client/newsletter/mex.d.ts +14 -0
  529. package/dist/types/client/newsletter/parse.d.ts +19 -0
  530. package/dist/types/client/newsletter/types.d.ts +190 -0
  531. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
  532. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  533. package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
  534. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  535. package/dist/types/client/types.d.ts +843 -71
  536. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  537. package/dist/types/crypto/core/index.d.ts +2 -2
  538. package/dist/types/crypto/core/keys.d.ts +0 -4
  539. package/dist/types/crypto/core/nonce.d.ts +4 -5
  540. package/dist/types/crypto/core/primitives.d.ts +31 -20
  541. package/dist/types/crypto/core/random.d.ts +6 -0
  542. package/dist/types/crypto/core/xeddsa.d.ts +9 -0
  543. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  544. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  545. package/dist/types/crypto/curves/constants.d.ts +4 -3
  546. package/dist/types/crypto/curves/types.d.ts +0 -5
  547. package/dist/types/crypto/math/constants.d.ts +0 -1
  548. package/dist/types/crypto/math/mod.d.ts +0 -1
  549. package/dist/types/index.d.ts +32 -6
  550. package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
  551. package/dist/types/infra/log/PinoLogger.d.ts +55 -1
  552. package/dist/types/infra/log/types.d.ts +6 -0
  553. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  554. package/dist/types/media/constants.d.ts +7 -2
  555. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  556. package/dist/types/media/index.d.ts +7 -5
  557. package/dist/types/media/processor.d.ts +27 -5
  558. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  559. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
  560. package/dist/types/media/transfer/conn.d.ts +7 -0
  561. package/dist/types/media/types.d.ts +1 -2
  562. package/dist/types/message/WaMessageClient.d.ts +14 -0
  563. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  564. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  565. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  566. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  567. package/dist/types/message/context-info.d.ts +66 -0
  568. package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
  569. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
  570. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  571. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  572. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  573. package/dist/types/message/encode/content.d.ts +43 -0
  574. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  575. package/dist/types/message/encode/media-payload.d.ts +12 -0
  576. package/dist/types/message/index.d.ts +2 -2
  577. package/dist/types/message/kinds/bot.d.ts +31 -0
  578. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  579. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  580. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  581. package/dist/types/message/primitives/incoming.d.ts +21 -0
  582. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  583. package/dist/types/message/types.d.ts +208 -10
  584. package/dist/types/mex.d.ts +2 -0
  585. package/dist/types/proto.d.ts +2 -2
  586. package/dist/types/protocol/abprops.d.ts +9 -0
  587. package/dist/types/protocol/appstate.d.ts +4 -49
  588. package/dist/types/protocol/auth.d.ts +2 -2
  589. package/dist/types/protocol/bot.d.ts +45 -0
  590. package/dist/types/protocol/browser.d.ts +8 -0
  591. package/dist/types/protocol/business.d.ts +21 -0
  592. package/dist/types/protocol/call.d.ts +44 -0
  593. package/dist/types/protocol/constants.d.ts +16 -3
  594. package/dist/types/protocol/defaults.d.ts +3 -0
  595. package/dist/types/protocol/group.d.ts +1 -1
  596. package/dist/types/protocol/index.d.ts +2 -1
  597. package/dist/types/protocol/jid.d.ts +78 -0
  598. package/dist/types/protocol/media.d.ts +21 -13
  599. package/dist/types/protocol/message.d.ts +4 -0
  600. package/dist/types/protocol/newsletter.d.ts +65 -0
  601. package/dist/types/protocol/nodes.d.ts +20 -0
  602. package/dist/types/protocol/notification.d.ts +16 -0
  603. package/dist/types/protocol/presence.d.ts +16 -0
  604. package/dist/types/protocol/status.d.ts +7 -0
  605. package/dist/types/retry/codec.d.ts +5 -0
  606. package/dist/types/retry/index.d.ts +1 -1
  607. package/dist/types/retry/parse.d.ts +9 -0
  608. package/dist/types/retry/reason.d.ts +5 -0
  609. package/dist/types/retry/replay.d.ts +19 -5
  610. package/dist/types/retry/tracker.d.ts +10 -3
  611. package/dist/types/retry/types.d.ts +3 -8
  612. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  613. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
  614. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
  615. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  616. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  617. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  618. package/dist/types/signal/api/codec.d.ts +20 -0
  619. package/dist/types/signal/api/constants.d.ts +1 -1
  620. package/dist/types/signal/api/prekeys.d.ts +4 -0
  621. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
  622. package/dist/types/signal/attestation/constants.d.ts +4 -0
  623. package/dist/types/signal/constants.d.ts +7 -4
  624. package/dist/types/signal/encoding.d.ts +6 -68
  625. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  626. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -0
  627. package/dist/types/signal/group/encoding.d.ts +25 -0
  628. package/dist/types/signal/index.d.ts +4 -1
  629. package/dist/types/signal/registration/encoding.d.ts +30 -0
  630. package/dist/types/signal/registration/keygen.d.ts +10 -0
  631. package/dist/types/signal/registration/utils.d.ts +5 -0
  632. package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
  633. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  634. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  635. package/dist/types/signal/session/encoding.d.ts +28 -0
  636. package/dist/types/signal/session/resolver.d.ts +14 -0
  637. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  638. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  639. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  640. package/dist/types/store/cache/session.cache.d.ts +23 -0
  641. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  642. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  643. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  644. package/dist/types/store/contracts/message.store.d.ts +0 -2
  645. package/dist/types/store/createStore.d.ts +54 -2
  646. package/dist/types/store/index.d.ts +17 -16
  647. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  648. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  649. package/dist/types/store/memory/auth.store.d.ts +18 -0
  650. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  651. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  652. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  653. package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
  654. package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
  655. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  656. package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
  657. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  658. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
  659. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  660. package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
  661. package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
  662. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  663. package/dist/types/store/noop.store.d.ts +2 -2
  664. package/dist/types/store/types.d.ts +250 -6
  665. package/dist/types/transport/WaComms.d.ts +5 -0
  666. package/dist/types/transport/WaWebSocket.d.ts +5 -0
  667. package/dist/types/transport/binary/constants.d.ts +8 -2
  668. package/dist/types/transport/binary/decoder.d.ts +5 -0
  669. package/dist/types/transport/binary/encoder.d.ts +5 -0
  670. package/dist/types/transport/binary/tokens.d.ts +6 -6
  671. package/dist/types/transport/index.d.ts +3 -1
  672. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
  673. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
  674. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
  675. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  676. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  677. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  678. package/dist/types/transport/node/builders/business.d.ts +21 -4
  679. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  680. package/dist/types/transport/node/builders/community.d.ts +17 -0
  681. package/dist/types/transport/node/builders/group.d.ts +44 -2
  682. package/dist/types/transport/node/builders/message.d.ts +11 -6
  683. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  684. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  685. package/dist/types/transport/node/builders/presence.d.ts +8 -1
  686. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  687. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  688. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  689. package/dist/types/transport/node/helpers.d.ts +1 -2
  690. package/dist/types/transport/node/mex/client.d.ts +12 -1
  691. package/dist/types/transport/node/query.d.ts +19 -1
  692. package/dist/types/transport/node/usync.d.ts +3 -0
  693. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +5 -0
  694. package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
  695. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  696. package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
  697. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  698. package/dist/types/transport/noise/constants.d.ts +4 -5
  699. package/dist/types/transport/proxy.d.ts +5 -0
  700. package/dist/types/transport/types.d.ts +14 -7
  701. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  702. package/dist/types/util/async.d.ts +4 -0
  703. package/dist/types/util/bytes.d.ts +36 -1
  704. package/dist/types/util/clock.d.ts +6 -0
  705. package/dist/types/util/coercion.d.ts +25 -0
  706. package/dist/types/util/collections.d.ts +8 -0
  707. package/dist/types/util/index.d.ts +2 -2
  708. package/dist/types/util/primitives.d.ts +11 -0
  709. package/dist/types/util/runtime.d.ts +5 -0
  710. package/dist/types/version-spec.d.ts +1 -0
  711. package/dist/util/async.js +4 -0
  712. package/dist/util/bytes.js +37 -2
  713. package/dist/util/clock.js +18 -0
  714. package/dist/util/coercion.js +48 -3
  715. package/dist/util/collections.js +12 -0
  716. package/dist/util/index.js +7 -1
  717. package/dist/util/primitives.js +20 -0
  718. package/dist/util/runtime.js +5 -0
  719. package/dist/version-spec.js +5 -0
  720. package/package.json +32 -8
  721. package/spec/appstate/index.d.ts +188 -0
  722. package/spec/appstate/index.js +850 -0
  723. package/spec/mex/index.d.ts +4172 -0
  724. package/spec/mex/index.js +261 -0
  725. package/spec/proto/index.d.ts +16305 -0
  726. package/spec/proto/index.js +1 -0
  727. package/spec/version/index.d.ts +4 -0
  728. package/spec/version/index.js +9 -0
  729. package/spec/version/version.json +3 -0
  730. package/dist/client/events/chat.js +0 -227
  731. package/dist/client/incoming.js +0 -306
  732. package/dist/client/mailbox.js +0 -66
  733. package/dist/client/messages.js +0 -305
  734. package/dist/esm/client/events/chat.js +0 -224
  735. package/dist/esm/client/incoming.js +0 -296
  736. package/dist/esm/client/mailbox.js +0 -63
  737. package/dist/esm/client/messages.js +0 -301
  738. package/dist/esm/media/WaMediaCrypto.js +0 -499
  739. package/dist/esm/message/phash.js +0 -47
  740. package/dist/esm/store/locks/participants.lock.js +0 -20
  741. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  742. package/dist/esm/store/providers/memory/device-list.store.js +0 -67
  743. package/dist/esm/transport/node/mex/persist-ids.js +0 -10
  744. package/dist/media/WaMediaCrypto.js +0 -503
  745. package/dist/message/phash.js +0 -50
  746. package/dist/store/locks/participants.lock.js +0 -23
  747. package/dist/store/providers/memory/contact.store.js +0 -32
  748. package/dist/store/providers/memory/device-list.store.js +0 -71
  749. package/dist/transport/node/mex/persist-ids.js +0 -13
  750. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
  751. package/dist/types/client/events/chat.d.ts +0 -3
  752. package/dist/types/client/history-sync.d.ts +0 -20
  753. package/dist/types/client/messages.d.ts +0 -18
  754. package/dist/types/client/messaging/participants.d.ts +0 -13
  755. package/dist/types/media/WaMediaCrypto.d.ts +0 -22
  756. package/dist/types/media/conn.d.ts +0 -3
  757. package/dist/types/message/content.d.ts +0 -14
  758. package/dist/types/message/incoming.d.ts +0 -18
  759. package/dist/types/signal/crypto/constants.d.ts +0 -4
  760. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  761. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  762. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  763. package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
  764. package/proto/index.d.ts +0 -10903
  765. package/proto/index.js +0 -1
  766. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  767. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  768. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  769. /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
  770. /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
  771. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  772. /package/dist/signal/{crypto → attestation}/constants.js +0 -0
  773. /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
  774. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaRetryCoordinator = void 0;
4
+ const incoming_1 = require("../../message/primitives/incoming");
4
5
  const _proto_1 = require("../../proto.js");
5
6
  const constants_1 = require("../../protocol/constants");
6
7
  const jid_1 = require("../../protocol/jid");
@@ -16,6 +17,16 @@ const collections_1 = require("../../util/collections");
16
17
  const primitives_1 = require("../../util/primitives");
17
18
  const RETRY_CLEANUP_INTERVAL_MS = 30000;
18
19
  const RETRY_SESSION_BASE_KEY_CACHE_MAX_ENTRIES = 8192;
20
+ const PLACEHOLDER_RESEND_RETRY_THRESHOLD = 3;
21
+ const PLACEHOLDER_RESEND_BATCH_SIZE = 32;
22
+ const PLACEHOLDER_RESEND_DEBOUNCE_MS = 200;
23
+ const PLACEHOLDER_RESEND_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;
24
+ const PLACEHOLDER_RESEND_IN_FLIGHT_MAX = 256;
25
+ const PLACEHOLDER_RESEND_SKIP_SUBTYPES = new Set([
26
+ 'bot_unavailable_fanout',
27
+ 'hosted_unavailable_fanout',
28
+ 'view_once_unavailable_fanout'
29
+ ]);
19
30
  function getRetryReasonName(code) {
20
31
  if (code === undefined) {
21
32
  return undefined;
@@ -36,27 +47,18 @@ function getRemoteRetryReasonLogFields(reason) {
36
47
  class WaRetryCoordinator {
37
48
  constructor(options) {
38
49
  this.nextRetryCleanupAtMs = 0;
39
- this.logger = options.logger;
40
- this.retryStore = options.retryStore;
41
- this.retryTtlMs = this.retryStore.getTtlMs?.() ?? constants_2.RETRY_OUTBOUND_TTL_MS;
42
- this.signalStore = options.signalStore;
43
- this.preKeyStore = options.preKeyStore;
44
- this.sessionStore = options.sessionStore;
45
- this.senderKeyStore = options.senderKeyStore;
46
- this.signalProtocol = options.signalProtocol;
47
- this.signalDeviceSync = options.signalDeviceSync;
48
- this.signalMissingPreKeysSync = options.signalMissingPreKeysSync;
49
- this.sendNode = options.sendNode;
50
- this.getCurrentMeJid = options.getCurrentMeJid;
51
- this.getCurrentMeLid = options.getCurrentMeLid;
52
- this.getCurrentSignedIdentity = options.getCurrentSignedIdentity;
50
+ this.placeholderInFlight = new Set();
51
+ this.placeholderQueue = [];
52
+ this.placeholderTimer = null;
53
+ this.deps = options;
54
+ this.retryTtlMs = options.retryStore.getTtlMs?.() ?? constants_2.RETRY_OUTBOUND_TTL_MS;
53
55
  this.retryReplayService = new replay_1.WaRetryReplayService({
54
- logger: this.logger,
56
+ logger: options.logger,
55
57
  messageClient: options.messageClient,
56
- signalProtocol: this.signalProtocol,
57
- getCurrentMeJid: this.getCurrentMeJid,
58
- getCurrentMeLid: this.getCurrentMeLid,
59
- getCurrentSignedIdentity: this.getCurrentSignedIdentity
58
+ signalProtocol: options.signalProtocol,
59
+ sessionResolver: options.sessionResolver,
60
+ getCurrentCredentials: options.getCurrentCredentials,
61
+ resolveUserIcdc: options.resolveUserIcdc
60
62
  });
61
63
  this.retryProcessingByMessageId = new Map();
62
64
  this.retrySessionBaseKeys = new Map();
@@ -67,11 +69,14 @@ class WaRetryCoordinator {
67
69
  if (!prepared) {
68
70
  return false;
69
71
  }
72
+ if (prepared.delegatedToPlaceholderResend) {
73
+ return true;
74
+ }
70
75
  await this.sendDecryptFailureRetryReceipt(context, prepared);
71
76
  return true;
72
77
  }
73
78
  catch (sendError) {
74
- this.logger.warn('failed to send retry receipt for decrypt failure', {
79
+ this.deps.logger.warn('failed to send retry receipt for decrypt failure', {
75
80
  id: context.stanzaId,
76
81
  from: context.from,
77
82
  participant: context.participant,
@@ -88,8 +93,9 @@ class WaRetryCoordinator {
88
93
  try {
89
94
  await this.maybeCleanupRetryStore(Date.now());
90
95
  const expectedToJids = [];
91
- const meJid = this.getCurrentMeJid()?.trim();
92
- const meLid = this.getCurrentMeLid()?.trim();
96
+ const credentials = this.deps.getCurrentCredentials();
97
+ const meJid = credentials?.meJid?.trim();
98
+ const meLid = credentials?.meLid?.trim();
93
99
  if (meJid) {
94
100
  expectedToJids.push(meJid);
95
101
  }
@@ -104,7 +110,7 @@ class WaRetryCoordinator {
104
110
  await this.handleParsedRetryRequest(receiptNode, request);
105
111
  }
106
112
  catch (error) {
107
- this.logger.warn('failed handling incoming retry request', {
113
+ this.deps.logger.warn('failed handling incoming retry request', {
108
114
  id: receiptNode.attrs.id,
109
115
  from: receiptNode.attrs.from,
110
116
  participant: receiptNode.attrs.participant,
@@ -119,13 +125,14 @@ class WaRetryCoordinator {
119
125
  }
120
126
  isRetryReceiptNode(node) {
121
127
  return (node.tag === constants_1.WA_MESSAGE_TAGS.RECEIPT &&
122
- (node.attrs.type === 'retry' || node.attrs.type === 'enc_rekey_retry'));
128
+ (node.attrs.type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_RETRY ||
129
+ node.attrs.type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY));
123
130
  }
124
131
  async prepareDecryptFailureRetry(context, error) {
125
132
  const nowMs = Date.now();
126
- const registrationInfo = await this.signalStore.getRegistrationInfo();
133
+ const registrationInfo = await this.deps.signalStore.getRegistrationInfo();
127
134
  if (!registrationInfo) {
128
- this.logger.warn('retry receipt skipped: missing local registration info', {
135
+ this.deps.logger.warn('retry receipt skipped: missing local registration info', {
129
136
  id: context.stanzaId,
130
137
  from: context.from
131
138
  });
@@ -133,23 +140,41 @@ class WaRetryCoordinator {
133
140
  }
134
141
  const requester = context.participant ?? context.from;
135
142
  const expiresAtMs = nowMs + this.retryTtlMs;
136
- const retryCount = await this.retryStore.incrementInboundCounter(context.stanzaId, requester, nowMs, expiresAtMs);
143
+ const retryCount = await this.deps.retryStore.incrementInboundCounter(context.stanzaId, requester, nowMs, expiresAtMs);
144
+ const delegatedToPlaceholderResend = retryCount >= PLACEHOLDER_RESEND_RETRY_THRESHOLD &&
145
+ this.enqueuePlaceholderResend(context);
146
+ if (delegatedToPlaceholderResend) {
147
+ return {
148
+ registrationId: registrationInfo.registrationId,
149
+ retryCount,
150
+ retryReason: (0, reason_1.mapRetryReasonFromError)(error),
151
+ timestamp: context.t ?? String(Math.trunc(nowMs / 1000)),
152
+ delegatedToPlaceholderResend: true
153
+ };
154
+ }
155
+ const senderDeviceJid = context.participant ?? context.from;
156
+ const forceKeysForHosted = senderDeviceJid ? (0, jid_1.isHostedDeviceJid)(senderDeviceJid) : false;
137
157
  return {
138
158
  registrationId: registrationInfo.registrationId,
139
159
  retryCount,
140
- retryKeys: retryCount >= constants_2.RETRY_KEYS_MIN_COUNT
141
- ? await this.buildRetryKeysSection(registrationInfo.identityKeyPair.pubKey)
160
+ retryKeys: forceKeysForHosted || retryCount >= constants_2.RETRY_KEYS_MIN_COUNT
161
+ ? ((await this.buildRetryKeysSection(registrationInfo.identityKeyPair.pubKey, {
162
+ stanzaId: context.stanzaId,
163
+ from: context.from
164
+ })) ?? undefined)
142
165
  : undefined,
143
166
  retryReason: (0, reason_1.mapRetryReasonFromError)(error),
144
- timestamp: context.t ?? String(Math.trunc(nowMs / 1000))
167
+ timestamp: context.t ?? String(Math.trunc(nowMs / 1000)),
168
+ delegatedToPlaceholderResend: false
145
169
  };
146
170
  }
147
171
  async sendDecryptFailureRetryReceipt(context, prepared) {
172
+ const recipient = context.recipient ?? this.resolvePeerRetryRecipient(context);
148
173
  const retryReceiptNode = (0, retry_1.buildRetryReceiptNode)({
149
174
  stanzaId: context.stanzaId,
150
175
  to: context.from,
151
176
  participant: context.participant,
152
- recipient: context.recipient,
177
+ recipient,
153
178
  originalMsgId: context.stanzaId,
154
179
  retryCount: prepared.retryCount,
155
180
  t: prepared.timestamp,
@@ -158,19 +183,40 @@ class WaRetryCoordinator {
158
183
  categoryPeer: context.messageNode.attrs.category === 'peer',
159
184
  keys: prepared.retryKeys
160
185
  });
161
- await this.sendNode(retryReceiptNode);
162
- this.logger.debug('sent retry receipt for decrypt failure', {
186
+ await this.deps.sendNode(retryReceiptNode);
187
+ this.deps.logger.trace('sent retry receipt for decrypt failure', {
163
188
  id: context.stanzaId,
164
189
  to: context.from,
165
190
  participant: context.participant,
191
+ recipient,
166
192
  retryCount: prepared.retryCount,
167
193
  reason: prepared.retryReason,
168
194
  withKeys: prepared.retryKeys !== undefined
169
195
  });
170
196
  }
197
+ resolvePeerRetryRecipient(context) {
198
+ if (!context.participant) {
199
+ return undefined;
200
+ }
201
+ const meLid = this.deps.getCurrentCredentials()?.meLid;
202
+ if (!meLid) {
203
+ return undefined;
204
+ }
205
+ try {
206
+ const participantUser = (0, jid_1.toUserJid)(context.participant);
207
+ const meUserLid = (0, jid_1.toUserJid)(meLid);
208
+ if (participantUser !== meUserLid) {
209
+ return undefined;
210
+ }
211
+ return meUserLid;
212
+ }
213
+ catch {
214
+ return undefined;
215
+ }
216
+ }
171
217
  async handleParsedRetryRequest(receiptNode, request) {
172
- if (request.type === 'enc_rekey_retry') {
173
- this.logger.info('received enc_rekey_retry request (voip path deferred)', {
218
+ if (request.type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY) {
219
+ this.deps.logger.debug('received enc_rekey_retry request (voip path deferred)', {
174
220
  id: request.stanzaId,
175
221
  originalMsgId: request.originalMsgId,
176
222
  from: request.from,
@@ -189,34 +235,35 @@ class WaRetryCoordinator {
189
235
  if (!prepared) {
190
236
  return;
191
237
  }
238
+ const requestLogger = this.deps.logger.child({
239
+ id: request.stanzaId,
240
+ originalMsgId: request.originalMsgId,
241
+ requester: prepared.requesterJid
242
+ });
192
243
  const resendResult = await this.retryReplayService.resendOutboundMessage(prepared.outbound, prepared.requesterJid, request.retryCount);
193
244
  if (resendResult === 'ineligible') {
194
- this.logger.info('retry request marked ineligible for resend', {
195
- id: request.stanzaId,
196
- originalMsgId: request.originalMsgId,
197
- requester: prepared.requesterJid,
245
+ requestLogger.debug('retry request marked ineligible for resend', {
198
246
  mode: prepared.outbound.replayMode
199
247
  });
200
248
  return;
201
249
  }
202
- this.logger.info('retry request processed and resent', {
203
- id: request.stanzaId,
204
- originalMsgId: request.originalMsgId,
205
- requester: prepared.requesterJid,
250
+ requestLogger.debug('retry request processed and resent', {
206
251
  mode: prepared.outbound.replayMode,
207
252
  remoteRetryCount: request.retryCount,
208
253
  ...getRemoteRetryReasonLogFields(request.retryReason)
209
254
  });
210
255
  }
211
256
  async prepareRetryResend(request) {
257
+ const requestLogger = this.deps.logger.child({
258
+ id: request.stanzaId,
259
+ originalMsgId: request.originalMsgId
260
+ });
212
261
  const requesterJid = request.participant ?? request.from ?? null;
213
262
  if (!requesterJid) {
214
- this.logger.warn('retry request ignored: missing requester jid', {
215
- id: request.stanzaId,
216
- originalMsgId: request.originalMsgId
217
- });
263
+ requestLogger.warn('retry request ignored: missing requester jid');
218
264
  return null;
219
265
  }
266
+ const requesterLogger = requestLogger.child({ requester: requesterJid });
220
267
  let requesterAddress;
221
268
  let requesterNormalizedDeviceJid;
222
269
  try {
@@ -225,39 +272,26 @@ class WaRetryCoordinator {
225
272
  requesterNormalizedDeviceJid = requesterParsed.normalizedJid;
226
273
  }
227
274
  catch (error) {
228
- this.logger.info('retry request rejected: invalid requester jid', {
229
- id: request.stanzaId,
230
- originalMsgId: request.originalMsgId,
231
- requester: requesterJid,
275
+ requesterLogger.debug('retry request rejected: invalid requester jid', {
232
276
  message: (0, primitives_1.toError)(error).message
233
277
  });
234
278
  return null;
235
279
  }
236
280
  if (request.retryCount >= constants_2.MAX_RETRY_ATTEMPTS) {
237
- this.logger.info('retry request rejected: retry count exceeded', {
238
- id: request.stanzaId,
239
- originalMsgId: request.originalMsgId,
240
- requester: requesterJid,
281
+ requesterLogger.debug('retry request rejected: retry count exceeded', {
241
282
  remoteRetryCount: request.retryCount,
242
283
  ...getRemoteRetryReasonLogFields(request.retryReason)
243
284
  });
244
285
  return null;
245
286
  }
246
- const outbound = await this.retryStore.getOutboundMessage(request.originalMsgId);
287
+ const outbound = await this.deps.retryStore.getOutboundMessage(request.originalMsgId);
247
288
  if (!outbound) {
248
- this.logger.info('retry request ignored: outbound message not found', {
249
- id: request.stanzaId,
250
- originalMsgId: request.originalMsgId,
251
- requester: requesterJid
252
- });
289
+ requesterLogger.debug('retry request ignored: outbound message not found');
253
290
  return null;
254
291
  }
255
292
  const sessionReady = await this.updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
256
293
  if (!sessionReady) {
257
- this.logger.info('retry request rejected: missing compatible session', {
258
- id: request.stanzaId,
259
- originalMsgId: request.originalMsgId,
260
- requester: requesterJid,
294
+ requesterLogger.debug('retry request rejected: missing compatible session', {
261
295
  remoteRetryCount: request.retryCount,
262
296
  ...getRemoteRetryReasonLogFields(request.retryReason)
263
297
  });
@@ -265,10 +299,7 @@ class WaRetryCoordinator {
265
299
  }
266
300
  const authorization = await this.authorizeRetryRequest(request, outbound, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
267
301
  if (!authorization.authorized) {
268
- this.logger.info('retry request rejected', {
269
- id: request.stanzaId,
270
- originalMsgId: request.originalMsgId,
271
- requester: requesterJid,
302
+ requesterLogger.debug('retry request rejected', {
272
303
  reason: authorization.reason,
273
304
  remoteRetryCount: request.retryCount,
274
305
  ...getRemoteRetryReasonLogFields(request.retryReason)
@@ -291,7 +322,8 @@ class WaRetryCoordinator {
291
322
  return;
292
323
  }
293
324
  const receiptType = receiptNode.attrs.type;
294
- if (receiptType === 'retry' || receiptType === 'enc_rekey_retry') {
325
+ if (receiptType === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_RETRY ||
326
+ receiptType === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY) {
295
327
  return;
296
328
  }
297
329
  const nextState = this.mapOutboundStateFromReceiptType(receiptType);
@@ -299,7 +331,7 @@ class WaRetryCoordinator {
299
331
  return;
300
332
  }
301
333
  await this.runRetryTaskSerialized(messageId, async () => {
302
- const current = await this.retryStore.getOutboundMessage(messageId);
334
+ const current = await this.deps.retryStore.getOutboundMessage(messageId);
303
335
  if (!current) {
304
336
  return;
305
337
  }
@@ -307,17 +339,17 @@ class WaRetryCoordinator {
307
339
  const expiresAtMs = nowMs + this.retryTtlMs;
308
340
  const merged = (0, parse_1.pickRetryStateMax)(current.state, nextState);
309
341
  if (merged !== current.state) {
310
- await this.retryStore.updateOutboundMessageState(messageId, merged, nowMs, expiresAtMs);
342
+ await this.deps.retryStore.updateOutboundMessageState(messageId, merged, nowMs, expiresAtMs);
311
343
  }
312
344
  const requesterJid = receiptNode.attrs.participant ?? receiptNode.attrs.from;
313
345
  if (!requesterJid) {
314
346
  return;
315
347
  }
316
348
  try {
317
- await this.retryStore.markOutboundRequesterDelivered(messageId, (0, jid_1.normalizeDeviceJid)(requesterJid), nowMs, expiresAtMs);
349
+ await this.deps.retryStore.markOutboundRequesterDelivered(messageId, (0, jid_1.normalizeDeviceJid)(requesterJid), nowMs, expiresAtMs);
318
350
  }
319
351
  catch (error) {
320
- this.logger.warn('failed to update outbound requester delivery state', {
352
+ this.deps.logger.warn('failed to update outbound requester delivery state', {
321
353
  id: messageId,
322
354
  requester: requesterJid,
323
355
  message: (0, primitives_1.toError)(error).message
@@ -340,17 +372,20 @@ class WaRetryCoordinator {
340
372
  }
341
373
  }
342
374
  }
343
- async buildRetryKeysSection(identity) {
375
+ async buildRetryKeysSection(identity, logContext) {
344
376
  const [signedPreKey, preKey] = await Promise.all([
345
- this.signalStore.getSignedPreKey(),
346
- this.preKeyStore.getOrGenSinglePreKey(keygen_1.generatePreKeyPair)
377
+ this.deps.signalStore.getSignedPreKey(),
378
+ this.deps.preKeyStore.getOrGenSinglePreKey(keygen_1.generatePreKeyPair)
347
379
  ]);
348
380
  if (!signedPreKey) {
349
- this.logger.warn('retry keys section skipped: signed prekey unavailable');
350
- return undefined;
381
+ this.deps.logger.warn('retry keys section skipped: signed prekey unavailable', {
382
+ id: logContext.stanzaId,
383
+ from: logContext.from
384
+ });
385
+ return null;
351
386
  }
352
- await this.preKeyStore.markKeyAsUploaded(preKey.keyId);
353
- const signedIdentity = this.getCurrentSignedIdentity();
387
+ await this.deps.preKeyStore.markKeyAsUploaded(preKey.keyId);
388
+ const signedIdentity = this.deps.getCurrentCredentials()?.signedIdentity;
354
389
  return {
355
390
  identity,
356
391
  key: {
@@ -368,13 +403,18 @@ class WaRetryCoordinator {
368
403
  };
369
404
  }
370
405
  async updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
406
+ const requestLogger = this.deps.logger.child({
407
+ id: request.stanzaId,
408
+ originalMsgId: request.originalMsgId,
409
+ requester: requesterJid
410
+ });
371
411
  const [, currentSession] = await Promise.all([
372
412
  this.markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress),
373
- this.sessionStore.getSession(requesterAddress)
413
+ this.deps.sessionStore.getSession(requesterAddress)
374
414
  ]);
375
415
  const regIdMismatch = !!currentSession && request.regId > 0 && currentSession.remote.regId !== request.regId;
376
416
  if (regIdMismatch && !request.keyBundle) {
377
- await this.sessionStore.deleteSession(requesterAddress);
417
+ await this.deps.sessionStore.deleteSession(requesterAddress);
378
418
  }
379
419
  if (request.keyBundle) {
380
420
  if (!request.keyBundle.key || !request.keyBundle.skey.signature) {
@@ -382,32 +422,26 @@ class WaRetryCoordinator {
382
422
  }
383
423
  if (request.offline) {
384
424
  if (!currentSession) {
385
- this.logger.info('retry request rejected: offline retry missing existing session', {
386
- id: request.stanzaId,
387
- originalMsgId: request.originalMsgId,
388
- requester: requesterJid,
425
+ requestLogger.debug('retry request rejected: offline retry missing existing session', {
389
426
  remoteRetryCount: request.retryCount,
390
427
  ...getRemoteRetryReasonLogFields(request.retryReason)
391
428
  });
392
- await this.sessionStore.deleteSession(requesterAddress);
429
+ await this.deps.sessionStore.deleteSession(requesterAddress);
393
430
  return false;
394
431
  }
395
432
  if (regIdMismatch) {
396
- this.logger.info('retry request rejected: offline retry registration id mismatch', {
397
- id: request.stanzaId,
398
- originalMsgId: request.originalMsgId,
399
- requester: requesterJid,
433
+ requestLogger.debug('retry request rejected: offline retry registration id mismatch', {
400
434
  remoteRetryCount: request.retryCount,
401
435
  ...getRemoteRetryReasonLogFields(request.retryReason)
402
436
  });
403
- await this.sessionStore.deleteSession(requesterAddress);
437
+ await this.deps.sessionStore.deleteSession(requesterAddress);
404
438
  return false;
405
439
  }
406
440
  }
407
441
  else if (regIdMismatch) {
408
- await this.sessionStore.deleteSession(requesterAddress);
442
+ await this.deps.sessionStore.deleteSession(requesterAddress);
409
443
  }
410
- await this.signalProtocol.establishOutgoingSession(requesterAddress, {
444
+ await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, {
411
445
  regId: request.regId,
412
446
  identity: request.keyBundle.identity,
413
447
  signedKey: {
@@ -430,14 +464,14 @@ class WaRetryCoordinator {
430
464
  if (!fetched) {
431
465
  return false;
432
466
  }
433
- await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
467
+ await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
434
468
  return this.applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
435
469
  }
436
470
  async applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
437
471
  if (request.retryCount < 2) {
438
472
  return true;
439
473
  }
440
- const currentSession = await this.sessionStore.getSession(requesterAddress);
474
+ const currentSession = await this.deps.sessionStore.getSession(requesterAddress);
441
475
  const sessionBaseKey = currentSession?.aliceBaseKey ?? null;
442
476
  if (!sessionBaseKey) {
443
477
  return true;
@@ -451,8 +485,8 @@ class WaRetryCoordinator {
451
485
  if (!saved || !(0, bytes_1.uint8Equal)(saved.baseKey, sessionBaseKey)) {
452
486
  return true;
453
487
  }
454
- await this.sessionStore.deleteSession(requesterAddress);
455
- this.logger.info('retry request forcing session refresh due to repeated base key', {
488
+ await this.deps.sessionStore.deleteSession(requesterAddress);
489
+ this.deps.logger.debug('retry request forcing session refresh due to repeated base key', {
456
490
  id: request.stanzaId,
457
491
  originalMsgId: request.originalMsgId,
458
492
  requester: requesterJid,
@@ -463,7 +497,7 @@ class WaRetryCoordinator {
463
497
  if (!fetched) {
464
498
  return false;
465
499
  }
466
- await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
500
+ await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
467
501
  return true;
468
502
  }
469
503
  async markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress) {
@@ -471,17 +505,17 @@ class WaRetryCoordinator {
471
505
  return;
472
506
  }
473
507
  try {
474
- const deleted = await this.senderKeyStore.markForgetSenderKey(request.from, [
508
+ const deleted = await this.deps.senderKeyStore.markForgetSenderKey(request.from, [
475
509
  requesterAddress
476
510
  ]);
477
- this.logger.debug('marked sender key as stale for group retry requester', {
511
+ this.deps.logger.debug('marked sender key as stale for group retry requester', {
478
512
  groupJid: request.from,
479
513
  requester: requesterJid,
480
514
  deleted
481
515
  });
482
516
  }
483
517
  catch (error) {
484
- this.logger.warn('failed to mark sender key as stale for group retry requester', {
518
+ this.deps.logger.warn('failed to mark sender key as stale for group retry requester', {
485
519
  groupJid: request.from,
486
520
  requester: requesterJid,
487
521
  message: (0, primitives_1.toError)(error).message
@@ -489,8 +523,9 @@ class WaRetryCoordinator {
489
523
  }
490
524
  }
491
525
  async fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, requesterRegistrationId) {
526
+ const requesterLogger = this.deps.logger.child({ requester: requesterJid });
492
527
  try {
493
- const results = await this.signalMissingPreKeysSync.fetchMissingPreKeys([
528
+ const results = await this.deps.signalMissingPreKeysSync.fetchMissingPreKeys([
494
529
  {
495
530
  userJid: `${requesterAddress.user}@${requesterAddress.server}`,
496
531
  devices: [
@@ -503,16 +538,14 @@ class WaRetryCoordinator {
503
538
  ]);
504
539
  const first = results[0];
505
540
  if (!first || !('devices' in first)) {
506
- this.logger.warn('missing prekeys fetch returned user error', {
507
- requester: requesterJid,
541
+ requesterLogger.debug('missing prekeys fetch returned user error', {
508
542
  errorText: first && 'errorText' in first ? first.errorText : 'unknown'
509
543
  });
510
544
  return null;
511
545
  }
512
546
  const matched = first.devices.find((device) => (0, jid_1.normalizeDeviceJid)(device.deviceJid) === requesterNormalizedDeviceJid);
513
547
  if (!matched) {
514
- this.logger.warn('missing prekeys fetch did not return requested device', {
515
- requester: requesterJid,
548
+ requesterLogger.debug('missing prekeys fetch did not return requested device', {
516
549
  devices: first.devices.length
517
550
  });
518
551
  return null;
@@ -520,8 +553,7 @@ class WaRetryCoordinator {
520
553
  return matched.bundle;
521
554
  }
522
555
  catch (error) {
523
- this.logger.warn('failed to fetch missing prekeys for retry requester', {
524
- requester: requesterJid,
556
+ requesterLogger.debug('failed to fetch missing prekeys for retry requester', {
525
557
  message: (0, primitives_1.toError)(error).message
526
558
  });
527
559
  return null;
@@ -533,10 +565,10 @@ class WaRetryCoordinator {
533
565
  }
534
566
  let requesterStatus = null;
535
567
  try {
536
- requesterStatus = await this.retryStore.getOutboundRequesterStatus(outbound.messageId, requesterNormalizedDeviceJid);
568
+ requesterStatus = await this.deps.retryStore.getOutboundRequesterStatus(outbound.messageId, (0, jid_1.toUserJid)(requesterNormalizedDeviceJid));
537
569
  }
538
570
  catch (error) {
539
- this.logger.warn('failed to resolve outbound requester status from retry store', {
571
+ this.deps.logger.warn('failed to resolve outbound requester status from retry store', {
540
572
  id: request.stanzaId,
541
573
  originalMsgId: request.originalMsgId,
542
574
  requester: requesterJid,
@@ -569,7 +601,7 @@ class WaRetryCoordinator {
569
601
  if (requesterNormalizedDeviceJid === (0, jid_1.normalizeDeviceJid)(requesterUser)) {
570
602
  return true;
571
603
  }
572
- const synced = await this.signalDeviceSync.syncDeviceList([requesterUser]);
604
+ const synced = await this.deps.signalDeviceSync.syncDeviceList([requesterUser]);
573
605
  const target = synced.find((entry) => entry.jid === requesterUser);
574
606
  if (!target) {
575
607
  return false;
@@ -582,7 +614,7 @@ class WaRetryCoordinator {
582
614
  return false;
583
615
  }
584
616
  catch (error) {
585
- this.logger.warn('retry authorization failed while syncing requester device list', {
617
+ this.deps.logger.warn('retry authorization failed while syncing requester device list', {
586
618
  requester: requesterJid,
587
619
  message: (0, primitives_1.toError)(error).message
588
620
  });
@@ -590,25 +622,25 @@ class WaRetryCoordinator {
590
622
  }
591
623
  }
592
624
  mapOutboundStateFromReceiptType(type) {
593
- if (type === 'read') {
625
+ if (type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_READ) {
594
626
  return 'read';
595
627
  }
596
- if (type === 'played') {
628
+ if (type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_PLAYED) {
597
629
  return 'played';
598
630
  }
599
631
  if (type === undefined ||
600
632
  type === '' ||
601
- type === 'delivery' ||
602
- type === 'sender' ||
603
- type === 'inactive' ||
604
- type === 'peer_msg') {
633
+ type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_DELIVERY ||
634
+ type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_SENDER ||
635
+ type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_INACTIVE ||
636
+ type === constants_1.WA_MESSAGE_TYPES.RECEIPT_TYPE_PEER) {
605
637
  return 'delivered';
606
638
  }
607
639
  return null;
608
640
  }
609
641
  async sendRetryAckSafe(receiptNode) {
610
642
  if (!receiptNode.attrs.id || !receiptNode.attrs.from) {
611
- this.logger.warn('retry ack skipped: missing receipt id/from', {
643
+ this.deps.logger.warn('retry ack skipped: missing receipt id/from', {
612
644
  hasId: receiptNode.attrs.id !== undefined,
613
645
  hasFrom: receiptNode.attrs.from !== undefined,
614
646
  participant: receiptNode.attrs.participant,
@@ -617,14 +649,14 @@ class WaRetryCoordinator {
617
649
  return;
618
650
  }
619
651
  try {
620
- await this.sendNode((0, global_1.buildAckNode)({
652
+ await this.deps.sendNode((0, global_1.buildAckNode)({
621
653
  kind: 'receipt',
622
654
  node: receiptNode,
623
655
  retryType: true
624
656
  }));
625
657
  }
626
658
  catch (error) {
627
- this.logger.warn('failed to send retry ack', {
659
+ this.deps.logger.warn('failed to send retry ack', {
628
660
  id: receiptNode.attrs.id,
629
661
  from: receiptNode.attrs.from,
630
662
  participant: receiptNode.attrs.participant,
@@ -639,10 +671,10 @@ class WaRetryCoordinator {
639
671
  this.nextRetryCleanupAtMs = nowMs + RETRY_CLEANUP_INTERVAL_MS;
640
672
  this.cleanupRetrySessionBaseKeys(nowMs);
641
673
  try {
642
- await this.retryStore.cleanupExpired(nowMs);
674
+ await this.deps.retryStore.cleanupExpired(nowMs);
643
675
  }
644
676
  catch (error) {
645
- this.logger.warn('retry store cleanup failed', {
677
+ this.deps.logger.warn('retry store cleanup failed', {
646
678
  message: (0, primitives_1.toError)(error).message
647
679
  });
648
680
  }
@@ -677,5 +709,104 @@ class WaRetryCoordinator {
677
709
  this.retrySessionBaseKeys.delete(key);
678
710
  }
679
711
  }
712
+ isSenderFromOwnAccount(context) {
713
+ const senderUser = (0, jid_1.parseSignalAddressFromJid)(context.participant ?? context.from).user;
714
+ const credentials = this.deps.getCurrentCredentials();
715
+ const meLid = credentials?.meLid;
716
+ if (meLid && (0, jid_1.parseSignalAddressFromJid)(meLid).user === senderUser)
717
+ return true;
718
+ const meJid = credentials?.meJid;
719
+ return !!meJid && (0, jid_1.parseSignalAddressFromJid)(meJid).user === senderUser;
720
+ }
721
+ enqueuePlaceholderResend(context) {
722
+ if (!this.deps.peerDataOperation || !this.deps.emitIncomingMessage) {
723
+ return false;
724
+ }
725
+ const subtype = context.messageNode.attrs.subtype;
726
+ if (typeof subtype === 'string' && PLACEHOLDER_RESEND_SKIP_SUBTYPES.has(subtype)) {
727
+ return false;
728
+ }
729
+ const timestampSeconds = context.t ? Number(context.t) : Date.now() / 1000;
730
+ if (Number.isFinite(timestampSeconds)) {
731
+ const ageSeconds = Date.now() / 1000 - timestampSeconds;
732
+ if (ageSeconds > PLACEHOLDER_RESEND_MAX_AGE_SECONDS) {
733
+ return false;
734
+ }
735
+ }
736
+ if (this.placeholderInFlight.has(context.stanzaId)) {
737
+ return true;
738
+ }
739
+ if (this.placeholderInFlight.size >= PLACEHOLDER_RESEND_IN_FLIGHT_MAX) {
740
+ this.deps.logger.warn('placeholder resend: in-flight set saturated, dropping enqueue', {
741
+ id: context.stanzaId,
742
+ maxInFlight: PLACEHOLDER_RESEND_IN_FLIGHT_MAX
743
+ });
744
+ return false;
745
+ }
746
+ this.placeholderInFlight.add(context.stanzaId);
747
+ this.placeholderQueue.push({
748
+ remoteJid: context.from,
749
+ id: context.stanzaId,
750
+ fromMe: this.isSenderFromOwnAccount(context),
751
+ participant: context.participant
752
+ });
753
+ if (this.placeholderTimer === null) {
754
+ this.placeholderTimer = setTimeout(() => {
755
+ this.placeholderTimer = null;
756
+ void this.flushPlaceholderBatch();
757
+ }, PLACEHOLDER_RESEND_DEBOUNCE_MS);
758
+ }
759
+ return true;
760
+ }
761
+ async flushPlaceholderBatch() {
762
+ const peerDataOperation = this.deps.peerDataOperation;
763
+ const emitIncomingMessage = this.deps.emitIncomingMessage;
764
+ if (!peerDataOperation || !emitIncomingMessage) {
765
+ this.placeholderQueue = [];
766
+ this.placeholderInFlight.clear();
767
+ return;
768
+ }
769
+ while (this.placeholderQueue.length > 0) {
770
+ const batch = this.placeholderQueue.splice(0, PLACEHOLDER_RESEND_BATCH_SIZE);
771
+ try {
772
+ const results = await peerDataOperation.request(_proto_1.proto.Message.PeerDataOperationRequestType.PLACEHOLDER_MESSAGE_RESEND, {
773
+ placeholderMessageResendRequest: batch.map((item) => ({
774
+ messageKey: {
775
+ remoteJid: item.remoteJid,
776
+ id: item.id,
777
+ fromMe: item.fromMe,
778
+ participant: item.participant
779
+ }
780
+ }))
781
+ });
782
+ for (const result of results) {
783
+ const bytes = result.placeholderMessageResendResponse?.webMessageInfoBytes;
784
+ if (!bytes) {
785
+ continue;
786
+ }
787
+ try {
788
+ const recovered = _proto_1.proto.WebMessageInfo.decode(bytes);
789
+ emitIncomingMessage((0, incoming_1.buildRecoveredIncomingEvent)(recovered));
790
+ }
791
+ catch (error) {
792
+ this.deps.logger.warn('placeholder resend: failed to decode WebMessageInfo', {
793
+ message: (0, primitives_1.toError)(error).message
794
+ });
795
+ }
796
+ }
797
+ }
798
+ catch (error) {
799
+ this.deps.logger.warn('placeholder resend: request failed', {
800
+ batchSize: batch.length,
801
+ message: (0, primitives_1.toError)(error).message
802
+ });
803
+ }
804
+ finally {
805
+ for (const item of batch) {
806
+ this.placeholderInFlight.delete(item.id);
807
+ }
808
+ }
809
+ }
810
+ }
680
811
  }
681
812
  exports.WaRetryCoordinator = WaRetryCoordinator;