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
+ import { buildRecoveredIncomingEvent } from '../../message/primitives/incoming.js';
1
2
  import { proto } from '../../proto.js';
2
- import { WA_MESSAGE_TAGS } from '../../protocol/constants.js';
3
- import { isGroupOrBroadcastJid, normalizeDeviceJid, parseJidFull } from '../../protocol/jid.js';
3
+ import { WA_MESSAGE_TAGS, WA_MESSAGE_TYPES } from '../../protocol/constants.js';
4
+ import { isGroupOrBroadcastJid, isHostedDeviceJid, normalizeDeviceJid, parseJidFull, parseSignalAddressFromJid, toUserJid } from '../../protocol/jid.js';
4
5
  import { MAX_RETRY_ATTEMPTS, RETRY_KEYS_MIN_COUNT, RETRY_OUTBOUND_TTL_MS, RETRY_REASON } from '../../retry/constants.js';
5
6
  import { parseRetryReceiptRequest, pickRetryStateMax } from '../../retry/parse.js';
6
7
  import { mapRetryReasonFromError } from '../../retry/reason.js';
@@ -13,6 +14,16 @@ import { setBoundedMapEntry } from '../../util/collections.js';
13
14
  import { toError } from '../../util/primitives.js';
14
15
  const RETRY_CLEANUP_INTERVAL_MS = 30000;
15
16
  const RETRY_SESSION_BASE_KEY_CACHE_MAX_ENTRIES = 8192;
17
+ const PLACEHOLDER_RESEND_RETRY_THRESHOLD = 3;
18
+ const PLACEHOLDER_RESEND_BATCH_SIZE = 32;
19
+ const PLACEHOLDER_RESEND_DEBOUNCE_MS = 200;
20
+ const PLACEHOLDER_RESEND_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;
21
+ const PLACEHOLDER_RESEND_IN_FLIGHT_MAX = 256;
22
+ const PLACEHOLDER_RESEND_SKIP_SUBTYPES = new Set([
23
+ 'bot_unavailable_fanout',
24
+ 'hosted_unavailable_fanout',
25
+ 'view_once_unavailable_fanout'
26
+ ]);
16
27
  function getRetryReasonName(code) {
17
28
  if (code === undefined) {
18
29
  return undefined;
@@ -33,27 +44,18 @@ function getRemoteRetryReasonLogFields(reason) {
33
44
  export class WaRetryCoordinator {
34
45
  constructor(options) {
35
46
  this.nextRetryCleanupAtMs = 0;
36
- this.logger = options.logger;
37
- this.retryStore = options.retryStore;
38
- this.retryTtlMs = this.retryStore.getTtlMs?.() ?? RETRY_OUTBOUND_TTL_MS;
39
- this.signalStore = options.signalStore;
40
- this.preKeyStore = options.preKeyStore;
41
- this.sessionStore = options.sessionStore;
42
- this.senderKeyStore = options.senderKeyStore;
43
- this.signalProtocol = options.signalProtocol;
44
- this.signalDeviceSync = options.signalDeviceSync;
45
- this.signalMissingPreKeysSync = options.signalMissingPreKeysSync;
46
- this.sendNode = options.sendNode;
47
- this.getCurrentMeJid = options.getCurrentMeJid;
48
- this.getCurrentMeLid = options.getCurrentMeLid;
49
- this.getCurrentSignedIdentity = options.getCurrentSignedIdentity;
47
+ this.placeholderInFlight = new Set();
48
+ this.placeholderQueue = [];
49
+ this.placeholderTimer = null;
50
+ this.deps = options;
51
+ this.retryTtlMs = options.retryStore.getTtlMs?.() ?? RETRY_OUTBOUND_TTL_MS;
50
52
  this.retryReplayService = new WaRetryReplayService({
51
- logger: this.logger,
53
+ logger: options.logger,
52
54
  messageClient: options.messageClient,
53
- signalProtocol: this.signalProtocol,
54
- getCurrentMeJid: this.getCurrentMeJid,
55
- getCurrentMeLid: this.getCurrentMeLid,
56
- getCurrentSignedIdentity: this.getCurrentSignedIdentity
55
+ signalProtocol: options.signalProtocol,
56
+ sessionResolver: options.sessionResolver,
57
+ getCurrentCredentials: options.getCurrentCredentials,
58
+ resolveUserIcdc: options.resolveUserIcdc
57
59
  });
58
60
  this.retryProcessingByMessageId = new Map();
59
61
  this.retrySessionBaseKeys = new Map();
@@ -64,11 +66,14 @@ export class WaRetryCoordinator {
64
66
  if (!prepared) {
65
67
  return false;
66
68
  }
69
+ if (prepared.delegatedToPlaceholderResend) {
70
+ return true;
71
+ }
67
72
  await this.sendDecryptFailureRetryReceipt(context, prepared);
68
73
  return true;
69
74
  }
70
75
  catch (sendError) {
71
- this.logger.warn('failed to send retry receipt for decrypt failure', {
76
+ this.deps.logger.warn('failed to send retry receipt for decrypt failure', {
72
77
  id: context.stanzaId,
73
78
  from: context.from,
74
79
  participant: context.participant,
@@ -85,8 +90,9 @@ export class WaRetryCoordinator {
85
90
  try {
86
91
  await this.maybeCleanupRetryStore(Date.now());
87
92
  const expectedToJids = [];
88
- const meJid = this.getCurrentMeJid()?.trim();
89
- const meLid = this.getCurrentMeLid()?.trim();
93
+ const credentials = this.deps.getCurrentCredentials();
94
+ const meJid = credentials?.meJid?.trim();
95
+ const meLid = credentials?.meLid?.trim();
90
96
  if (meJid) {
91
97
  expectedToJids.push(meJid);
92
98
  }
@@ -101,7 +107,7 @@ export class WaRetryCoordinator {
101
107
  await this.handleParsedRetryRequest(receiptNode, request);
102
108
  }
103
109
  catch (error) {
104
- this.logger.warn('failed handling incoming retry request', {
110
+ this.deps.logger.warn('failed handling incoming retry request', {
105
111
  id: receiptNode.attrs.id,
106
112
  from: receiptNode.attrs.from,
107
113
  participant: receiptNode.attrs.participant,
@@ -116,13 +122,14 @@ export class WaRetryCoordinator {
116
122
  }
117
123
  isRetryReceiptNode(node) {
118
124
  return (node.tag === WA_MESSAGE_TAGS.RECEIPT &&
119
- (node.attrs.type === 'retry' || node.attrs.type === 'enc_rekey_retry'));
125
+ (node.attrs.type === WA_MESSAGE_TYPES.RECEIPT_TYPE_RETRY ||
126
+ node.attrs.type === WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY));
120
127
  }
121
128
  async prepareDecryptFailureRetry(context, error) {
122
129
  const nowMs = Date.now();
123
- const registrationInfo = await this.signalStore.getRegistrationInfo();
130
+ const registrationInfo = await this.deps.signalStore.getRegistrationInfo();
124
131
  if (!registrationInfo) {
125
- this.logger.warn('retry receipt skipped: missing local registration info', {
132
+ this.deps.logger.warn('retry receipt skipped: missing local registration info', {
126
133
  id: context.stanzaId,
127
134
  from: context.from
128
135
  });
@@ -130,23 +137,41 @@ export class WaRetryCoordinator {
130
137
  }
131
138
  const requester = context.participant ?? context.from;
132
139
  const expiresAtMs = nowMs + this.retryTtlMs;
133
- const retryCount = await this.retryStore.incrementInboundCounter(context.stanzaId, requester, nowMs, expiresAtMs);
140
+ const retryCount = await this.deps.retryStore.incrementInboundCounter(context.stanzaId, requester, nowMs, expiresAtMs);
141
+ const delegatedToPlaceholderResend = retryCount >= PLACEHOLDER_RESEND_RETRY_THRESHOLD &&
142
+ this.enqueuePlaceholderResend(context);
143
+ if (delegatedToPlaceholderResend) {
144
+ return {
145
+ registrationId: registrationInfo.registrationId,
146
+ retryCount,
147
+ retryReason: mapRetryReasonFromError(error),
148
+ timestamp: context.t ?? String(Math.trunc(nowMs / 1000)),
149
+ delegatedToPlaceholderResend: true
150
+ };
151
+ }
152
+ const senderDeviceJid = context.participant ?? context.from;
153
+ const forceKeysForHosted = senderDeviceJid ? isHostedDeviceJid(senderDeviceJid) : false;
134
154
  return {
135
155
  registrationId: registrationInfo.registrationId,
136
156
  retryCount,
137
- retryKeys: retryCount >= RETRY_KEYS_MIN_COUNT
138
- ? await this.buildRetryKeysSection(registrationInfo.identityKeyPair.pubKey)
157
+ retryKeys: forceKeysForHosted || retryCount >= RETRY_KEYS_MIN_COUNT
158
+ ? ((await this.buildRetryKeysSection(registrationInfo.identityKeyPair.pubKey, {
159
+ stanzaId: context.stanzaId,
160
+ from: context.from
161
+ })) ?? undefined)
139
162
  : undefined,
140
163
  retryReason: mapRetryReasonFromError(error),
141
- timestamp: context.t ?? String(Math.trunc(nowMs / 1000))
164
+ timestamp: context.t ?? String(Math.trunc(nowMs / 1000)),
165
+ delegatedToPlaceholderResend: false
142
166
  };
143
167
  }
144
168
  async sendDecryptFailureRetryReceipt(context, prepared) {
169
+ const recipient = context.recipient ?? this.resolvePeerRetryRecipient(context);
145
170
  const retryReceiptNode = buildRetryReceiptNode({
146
171
  stanzaId: context.stanzaId,
147
172
  to: context.from,
148
173
  participant: context.participant,
149
- recipient: context.recipient,
174
+ recipient,
150
175
  originalMsgId: context.stanzaId,
151
176
  retryCount: prepared.retryCount,
152
177
  t: prepared.timestamp,
@@ -155,19 +180,40 @@ export class WaRetryCoordinator {
155
180
  categoryPeer: context.messageNode.attrs.category === 'peer',
156
181
  keys: prepared.retryKeys
157
182
  });
158
- await this.sendNode(retryReceiptNode);
159
- this.logger.debug('sent retry receipt for decrypt failure', {
183
+ await this.deps.sendNode(retryReceiptNode);
184
+ this.deps.logger.trace('sent retry receipt for decrypt failure', {
160
185
  id: context.stanzaId,
161
186
  to: context.from,
162
187
  participant: context.participant,
188
+ recipient,
163
189
  retryCount: prepared.retryCount,
164
190
  reason: prepared.retryReason,
165
191
  withKeys: prepared.retryKeys !== undefined
166
192
  });
167
193
  }
194
+ resolvePeerRetryRecipient(context) {
195
+ if (!context.participant) {
196
+ return undefined;
197
+ }
198
+ const meLid = this.deps.getCurrentCredentials()?.meLid;
199
+ if (!meLid) {
200
+ return undefined;
201
+ }
202
+ try {
203
+ const participantUser = toUserJid(context.participant);
204
+ const meUserLid = toUserJid(meLid);
205
+ if (participantUser !== meUserLid) {
206
+ return undefined;
207
+ }
208
+ return meUserLid;
209
+ }
210
+ catch {
211
+ return undefined;
212
+ }
213
+ }
168
214
  async handleParsedRetryRequest(receiptNode, request) {
169
- if (request.type === 'enc_rekey_retry') {
170
- this.logger.info('received enc_rekey_retry request (voip path deferred)', {
215
+ if (request.type === WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY) {
216
+ this.deps.logger.debug('received enc_rekey_retry request (voip path deferred)', {
171
217
  id: request.stanzaId,
172
218
  originalMsgId: request.originalMsgId,
173
219
  from: request.from,
@@ -186,34 +232,35 @@ export class WaRetryCoordinator {
186
232
  if (!prepared) {
187
233
  return;
188
234
  }
235
+ const requestLogger = this.deps.logger.child({
236
+ id: request.stanzaId,
237
+ originalMsgId: request.originalMsgId,
238
+ requester: prepared.requesterJid
239
+ });
189
240
  const resendResult = await this.retryReplayService.resendOutboundMessage(prepared.outbound, prepared.requesterJid, request.retryCount);
190
241
  if (resendResult === 'ineligible') {
191
- this.logger.info('retry request marked ineligible for resend', {
192
- id: request.stanzaId,
193
- originalMsgId: request.originalMsgId,
194
- requester: prepared.requesterJid,
242
+ requestLogger.debug('retry request marked ineligible for resend', {
195
243
  mode: prepared.outbound.replayMode
196
244
  });
197
245
  return;
198
246
  }
199
- this.logger.info('retry request processed and resent', {
200
- id: request.stanzaId,
201
- originalMsgId: request.originalMsgId,
202
- requester: prepared.requesterJid,
247
+ requestLogger.debug('retry request processed and resent', {
203
248
  mode: prepared.outbound.replayMode,
204
249
  remoteRetryCount: request.retryCount,
205
250
  ...getRemoteRetryReasonLogFields(request.retryReason)
206
251
  });
207
252
  }
208
253
  async prepareRetryResend(request) {
254
+ const requestLogger = this.deps.logger.child({
255
+ id: request.stanzaId,
256
+ originalMsgId: request.originalMsgId
257
+ });
209
258
  const requesterJid = request.participant ?? request.from ?? null;
210
259
  if (!requesterJid) {
211
- this.logger.warn('retry request ignored: missing requester jid', {
212
- id: request.stanzaId,
213
- originalMsgId: request.originalMsgId
214
- });
260
+ requestLogger.warn('retry request ignored: missing requester jid');
215
261
  return null;
216
262
  }
263
+ const requesterLogger = requestLogger.child({ requester: requesterJid });
217
264
  let requesterAddress;
218
265
  let requesterNormalizedDeviceJid;
219
266
  try {
@@ -222,39 +269,26 @@ export class WaRetryCoordinator {
222
269
  requesterNormalizedDeviceJid = requesterParsed.normalizedJid;
223
270
  }
224
271
  catch (error) {
225
- this.logger.info('retry request rejected: invalid requester jid', {
226
- id: request.stanzaId,
227
- originalMsgId: request.originalMsgId,
228
- requester: requesterJid,
272
+ requesterLogger.debug('retry request rejected: invalid requester jid', {
229
273
  message: toError(error).message
230
274
  });
231
275
  return null;
232
276
  }
233
277
  if (request.retryCount >= MAX_RETRY_ATTEMPTS) {
234
- this.logger.info('retry request rejected: retry count exceeded', {
235
- id: request.stanzaId,
236
- originalMsgId: request.originalMsgId,
237
- requester: requesterJid,
278
+ requesterLogger.debug('retry request rejected: retry count exceeded', {
238
279
  remoteRetryCount: request.retryCount,
239
280
  ...getRemoteRetryReasonLogFields(request.retryReason)
240
281
  });
241
282
  return null;
242
283
  }
243
- const outbound = await this.retryStore.getOutboundMessage(request.originalMsgId);
284
+ const outbound = await this.deps.retryStore.getOutboundMessage(request.originalMsgId);
244
285
  if (!outbound) {
245
- this.logger.info('retry request ignored: outbound message not found', {
246
- id: request.stanzaId,
247
- originalMsgId: request.originalMsgId,
248
- requester: requesterJid
249
- });
286
+ requesterLogger.debug('retry request ignored: outbound message not found');
250
287
  return null;
251
288
  }
252
289
  const sessionReady = await this.updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
253
290
  if (!sessionReady) {
254
- this.logger.info('retry request rejected: missing compatible session', {
255
- id: request.stanzaId,
256
- originalMsgId: request.originalMsgId,
257
- requester: requesterJid,
291
+ requesterLogger.debug('retry request rejected: missing compatible session', {
258
292
  remoteRetryCount: request.retryCount,
259
293
  ...getRemoteRetryReasonLogFields(request.retryReason)
260
294
  });
@@ -262,10 +296,7 @@ export class WaRetryCoordinator {
262
296
  }
263
297
  const authorization = await this.authorizeRetryRequest(request, outbound, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
264
298
  if (!authorization.authorized) {
265
- this.logger.info('retry request rejected', {
266
- id: request.stanzaId,
267
- originalMsgId: request.originalMsgId,
268
- requester: requesterJid,
299
+ requesterLogger.debug('retry request rejected', {
269
300
  reason: authorization.reason,
270
301
  remoteRetryCount: request.retryCount,
271
302
  ...getRemoteRetryReasonLogFields(request.retryReason)
@@ -288,7 +319,8 @@ export class WaRetryCoordinator {
288
319
  return;
289
320
  }
290
321
  const receiptType = receiptNode.attrs.type;
291
- if (receiptType === 'retry' || receiptType === 'enc_rekey_retry') {
322
+ if (receiptType === WA_MESSAGE_TYPES.RECEIPT_TYPE_RETRY ||
323
+ receiptType === WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY) {
292
324
  return;
293
325
  }
294
326
  const nextState = this.mapOutboundStateFromReceiptType(receiptType);
@@ -296,7 +328,7 @@ export class WaRetryCoordinator {
296
328
  return;
297
329
  }
298
330
  await this.runRetryTaskSerialized(messageId, async () => {
299
- const current = await this.retryStore.getOutboundMessage(messageId);
331
+ const current = await this.deps.retryStore.getOutboundMessage(messageId);
300
332
  if (!current) {
301
333
  return;
302
334
  }
@@ -304,17 +336,17 @@ export class WaRetryCoordinator {
304
336
  const expiresAtMs = nowMs + this.retryTtlMs;
305
337
  const merged = pickRetryStateMax(current.state, nextState);
306
338
  if (merged !== current.state) {
307
- await this.retryStore.updateOutboundMessageState(messageId, merged, nowMs, expiresAtMs);
339
+ await this.deps.retryStore.updateOutboundMessageState(messageId, merged, nowMs, expiresAtMs);
308
340
  }
309
341
  const requesterJid = receiptNode.attrs.participant ?? receiptNode.attrs.from;
310
342
  if (!requesterJid) {
311
343
  return;
312
344
  }
313
345
  try {
314
- await this.retryStore.markOutboundRequesterDelivered(messageId, normalizeDeviceJid(requesterJid), nowMs, expiresAtMs);
346
+ await this.deps.retryStore.markOutboundRequesterDelivered(messageId, normalizeDeviceJid(requesterJid), nowMs, expiresAtMs);
315
347
  }
316
348
  catch (error) {
317
- this.logger.warn('failed to update outbound requester delivery state', {
349
+ this.deps.logger.warn('failed to update outbound requester delivery state', {
318
350
  id: messageId,
319
351
  requester: requesterJid,
320
352
  message: toError(error).message
@@ -337,17 +369,20 @@ export class WaRetryCoordinator {
337
369
  }
338
370
  }
339
371
  }
340
- async buildRetryKeysSection(identity) {
372
+ async buildRetryKeysSection(identity, logContext) {
341
373
  const [signedPreKey, preKey] = await Promise.all([
342
- this.signalStore.getSignedPreKey(),
343
- this.preKeyStore.getOrGenSinglePreKey(generatePreKeyPair)
374
+ this.deps.signalStore.getSignedPreKey(),
375
+ this.deps.preKeyStore.getOrGenSinglePreKey(generatePreKeyPair)
344
376
  ]);
345
377
  if (!signedPreKey) {
346
- this.logger.warn('retry keys section skipped: signed prekey unavailable');
347
- return undefined;
378
+ this.deps.logger.warn('retry keys section skipped: signed prekey unavailable', {
379
+ id: logContext.stanzaId,
380
+ from: logContext.from
381
+ });
382
+ return null;
348
383
  }
349
- await this.preKeyStore.markKeyAsUploaded(preKey.keyId);
350
- const signedIdentity = this.getCurrentSignedIdentity();
384
+ await this.deps.preKeyStore.markKeyAsUploaded(preKey.keyId);
385
+ const signedIdentity = this.deps.getCurrentCredentials()?.signedIdentity;
351
386
  return {
352
387
  identity,
353
388
  key: {
@@ -365,13 +400,18 @@ export class WaRetryCoordinator {
365
400
  };
366
401
  }
367
402
  async updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
403
+ const requestLogger = this.deps.logger.child({
404
+ id: request.stanzaId,
405
+ originalMsgId: request.originalMsgId,
406
+ requester: requesterJid
407
+ });
368
408
  const [, currentSession] = await Promise.all([
369
409
  this.markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress),
370
- this.sessionStore.getSession(requesterAddress)
410
+ this.deps.sessionStore.getSession(requesterAddress)
371
411
  ]);
372
412
  const regIdMismatch = !!currentSession && request.regId > 0 && currentSession.remote.regId !== request.regId;
373
413
  if (regIdMismatch && !request.keyBundle) {
374
- await this.sessionStore.deleteSession(requesterAddress);
414
+ await this.deps.sessionStore.deleteSession(requesterAddress);
375
415
  }
376
416
  if (request.keyBundle) {
377
417
  if (!request.keyBundle.key || !request.keyBundle.skey.signature) {
@@ -379,32 +419,26 @@ export class WaRetryCoordinator {
379
419
  }
380
420
  if (request.offline) {
381
421
  if (!currentSession) {
382
- this.logger.info('retry request rejected: offline retry missing existing session', {
383
- id: request.stanzaId,
384
- originalMsgId: request.originalMsgId,
385
- requester: requesterJid,
422
+ requestLogger.debug('retry request rejected: offline retry missing existing session', {
386
423
  remoteRetryCount: request.retryCount,
387
424
  ...getRemoteRetryReasonLogFields(request.retryReason)
388
425
  });
389
- await this.sessionStore.deleteSession(requesterAddress);
426
+ await this.deps.sessionStore.deleteSession(requesterAddress);
390
427
  return false;
391
428
  }
392
429
  if (regIdMismatch) {
393
- this.logger.info('retry request rejected: offline retry registration id mismatch', {
394
- id: request.stanzaId,
395
- originalMsgId: request.originalMsgId,
396
- requester: requesterJid,
430
+ requestLogger.debug('retry request rejected: offline retry registration id mismatch', {
397
431
  remoteRetryCount: request.retryCount,
398
432
  ...getRemoteRetryReasonLogFields(request.retryReason)
399
433
  });
400
- await this.sessionStore.deleteSession(requesterAddress);
434
+ await this.deps.sessionStore.deleteSession(requesterAddress);
401
435
  return false;
402
436
  }
403
437
  }
404
438
  else if (regIdMismatch) {
405
- await this.sessionStore.deleteSession(requesterAddress);
439
+ await this.deps.sessionStore.deleteSession(requesterAddress);
406
440
  }
407
- await this.signalProtocol.establishOutgoingSession(requesterAddress, {
441
+ await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, {
408
442
  regId: request.regId,
409
443
  identity: request.keyBundle.identity,
410
444
  signedKey: {
@@ -427,14 +461,14 @@ export class WaRetryCoordinator {
427
461
  if (!fetched) {
428
462
  return false;
429
463
  }
430
- await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
464
+ await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
431
465
  return this.applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
432
466
  }
433
467
  async applySessionBaseKeyPolicy(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
434
468
  if (request.retryCount < 2) {
435
469
  return true;
436
470
  }
437
- const currentSession = await this.sessionStore.getSession(requesterAddress);
471
+ const currentSession = await this.deps.sessionStore.getSession(requesterAddress);
438
472
  const sessionBaseKey = currentSession?.aliceBaseKey ?? null;
439
473
  if (!sessionBaseKey) {
440
474
  return true;
@@ -448,8 +482,8 @@ export class WaRetryCoordinator {
448
482
  if (!saved || !uint8Equal(saved.baseKey, sessionBaseKey)) {
449
483
  return true;
450
484
  }
451
- await this.sessionStore.deleteSession(requesterAddress);
452
- this.logger.info('retry request forcing session refresh due to repeated base key', {
485
+ await this.deps.sessionStore.deleteSession(requesterAddress);
486
+ this.deps.logger.debug('retry request forcing session refresh due to repeated base key', {
453
487
  id: request.stanzaId,
454
488
  originalMsgId: request.originalMsgId,
455
489
  requester: requesterJid,
@@ -460,7 +494,7 @@ export class WaRetryCoordinator {
460
494
  if (!fetched) {
461
495
  return false;
462
496
  }
463
- await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
497
+ await this.deps.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
464
498
  return true;
465
499
  }
466
500
  async markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress) {
@@ -468,17 +502,17 @@ export class WaRetryCoordinator {
468
502
  return;
469
503
  }
470
504
  try {
471
- const deleted = await this.senderKeyStore.markForgetSenderKey(request.from, [
505
+ const deleted = await this.deps.senderKeyStore.markForgetSenderKey(request.from, [
472
506
  requesterAddress
473
507
  ]);
474
- this.logger.debug('marked sender key as stale for group retry requester', {
508
+ this.deps.logger.debug('marked sender key as stale for group retry requester', {
475
509
  groupJid: request.from,
476
510
  requester: requesterJid,
477
511
  deleted
478
512
  });
479
513
  }
480
514
  catch (error) {
481
- this.logger.warn('failed to mark sender key as stale for group retry requester', {
515
+ this.deps.logger.warn('failed to mark sender key as stale for group retry requester', {
482
516
  groupJid: request.from,
483
517
  requester: requesterJid,
484
518
  message: toError(error).message
@@ -486,8 +520,9 @@ export class WaRetryCoordinator {
486
520
  }
487
521
  }
488
522
  async fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, requesterRegistrationId) {
523
+ const requesterLogger = this.deps.logger.child({ requester: requesterJid });
489
524
  try {
490
- const results = await this.signalMissingPreKeysSync.fetchMissingPreKeys([
525
+ const results = await this.deps.signalMissingPreKeysSync.fetchMissingPreKeys([
491
526
  {
492
527
  userJid: `${requesterAddress.user}@${requesterAddress.server}`,
493
528
  devices: [
@@ -500,16 +535,14 @@ export class WaRetryCoordinator {
500
535
  ]);
501
536
  const first = results[0];
502
537
  if (!first || !('devices' in first)) {
503
- this.logger.warn('missing prekeys fetch returned user error', {
504
- requester: requesterJid,
538
+ requesterLogger.debug('missing prekeys fetch returned user error', {
505
539
  errorText: first && 'errorText' in first ? first.errorText : 'unknown'
506
540
  });
507
541
  return null;
508
542
  }
509
543
  const matched = first.devices.find((device) => normalizeDeviceJid(device.deviceJid) === requesterNormalizedDeviceJid);
510
544
  if (!matched) {
511
- this.logger.warn('missing prekeys fetch did not return requested device', {
512
- requester: requesterJid,
545
+ requesterLogger.debug('missing prekeys fetch did not return requested device', {
513
546
  devices: first.devices.length
514
547
  });
515
548
  return null;
@@ -517,8 +550,7 @@ export class WaRetryCoordinator {
517
550
  return matched.bundle;
518
551
  }
519
552
  catch (error) {
520
- this.logger.warn('failed to fetch missing prekeys for retry requester', {
521
- requester: requesterJid,
553
+ requesterLogger.debug('failed to fetch missing prekeys for retry requester', {
522
554
  message: toError(error).message
523
555
  });
524
556
  return null;
@@ -530,10 +562,10 @@ export class WaRetryCoordinator {
530
562
  }
531
563
  let requesterStatus = null;
532
564
  try {
533
- requesterStatus = await this.retryStore.getOutboundRequesterStatus(outbound.messageId, requesterNormalizedDeviceJid);
565
+ requesterStatus = await this.deps.retryStore.getOutboundRequesterStatus(outbound.messageId, toUserJid(requesterNormalizedDeviceJid));
534
566
  }
535
567
  catch (error) {
536
- this.logger.warn('failed to resolve outbound requester status from retry store', {
568
+ this.deps.logger.warn('failed to resolve outbound requester status from retry store', {
537
569
  id: request.stanzaId,
538
570
  originalMsgId: request.originalMsgId,
539
571
  requester: requesterJid,
@@ -566,7 +598,7 @@ export class WaRetryCoordinator {
566
598
  if (requesterNormalizedDeviceJid === normalizeDeviceJid(requesterUser)) {
567
599
  return true;
568
600
  }
569
- const synced = await this.signalDeviceSync.syncDeviceList([requesterUser]);
601
+ const synced = await this.deps.signalDeviceSync.syncDeviceList([requesterUser]);
570
602
  const target = synced.find((entry) => entry.jid === requesterUser);
571
603
  if (!target) {
572
604
  return false;
@@ -579,7 +611,7 @@ export class WaRetryCoordinator {
579
611
  return false;
580
612
  }
581
613
  catch (error) {
582
- this.logger.warn('retry authorization failed while syncing requester device list', {
614
+ this.deps.logger.warn('retry authorization failed while syncing requester device list', {
583
615
  requester: requesterJid,
584
616
  message: toError(error).message
585
617
  });
@@ -587,25 +619,25 @@ export class WaRetryCoordinator {
587
619
  }
588
620
  }
589
621
  mapOutboundStateFromReceiptType(type) {
590
- if (type === 'read') {
622
+ if (type === WA_MESSAGE_TYPES.RECEIPT_TYPE_READ) {
591
623
  return 'read';
592
624
  }
593
- if (type === 'played') {
625
+ if (type === WA_MESSAGE_TYPES.RECEIPT_TYPE_PLAYED) {
594
626
  return 'played';
595
627
  }
596
628
  if (type === undefined ||
597
629
  type === '' ||
598
- type === 'delivery' ||
599
- type === 'sender' ||
600
- type === 'inactive' ||
601
- type === 'peer_msg') {
630
+ type === WA_MESSAGE_TYPES.RECEIPT_TYPE_DELIVERY ||
631
+ type === WA_MESSAGE_TYPES.RECEIPT_TYPE_SENDER ||
632
+ type === WA_MESSAGE_TYPES.RECEIPT_TYPE_INACTIVE ||
633
+ type === WA_MESSAGE_TYPES.RECEIPT_TYPE_PEER) {
602
634
  return 'delivered';
603
635
  }
604
636
  return null;
605
637
  }
606
638
  async sendRetryAckSafe(receiptNode) {
607
639
  if (!receiptNode.attrs.id || !receiptNode.attrs.from) {
608
- this.logger.warn('retry ack skipped: missing receipt id/from', {
640
+ this.deps.logger.warn('retry ack skipped: missing receipt id/from', {
609
641
  hasId: receiptNode.attrs.id !== undefined,
610
642
  hasFrom: receiptNode.attrs.from !== undefined,
611
643
  participant: receiptNode.attrs.participant,
@@ -614,14 +646,14 @@ export class WaRetryCoordinator {
614
646
  return;
615
647
  }
616
648
  try {
617
- await this.sendNode(buildAckNode({
649
+ await this.deps.sendNode(buildAckNode({
618
650
  kind: 'receipt',
619
651
  node: receiptNode,
620
652
  retryType: true
621
653
  }));
622
654
  }
623
655
  catch (error) {
624
- this.logger.warn('failed to send retry ack', {
656
+ this.deps.logger.warn('failed to send retry ack', {
625
657
  id: receiptNode.attrs.id,
626
658
  from: receiptNode.attrs.from,
627
659
  participant: receiptNode.attrs.participant,
@@ -636,10 +668,10 @@ export class WaRetryCoordinator {
636
668
  this.nextRetryCleanupAtMs = nowMs + RETRY_CLEANUP_INTERVAL_MS;
637
669
  this.cleanupRetrySessionBaseKeys(nowMs);
638
670
  try {
639
- await this.retryStore.cleanupExpired(nowMs);
671
+ await this.deps.retryStore.cleanupExpired(nowMs);
640
672
  }
641
673
  catch (error) {
642
- this.logger.warn('retry store cleanup failed', {
674
+ this.deps.logger.warn('retry store cleanup failed', {
643
675
  message: toError(error).message
644
676
  });
645
677
  }
@@ -674,4 +706,103 @@ export class WaRetryCoordinator {
674
706
  this.retrySessionBaseKeys.delete(key);
675
707
  }
676
708
  }
709
+ isSenderFromOwnAccount(context) {
710
+ const senderUser = parseSignalAddressFromJid(context.participant ?? context.from).user;
711
+ const credentials = this.deps.getCurrentCredentials();
712
+ const meLid = credentials?.meLid;
713
+ if (meLid && parseSignalAddressFromJid(meLid).user === senderUser)
714
+ return true;
715
+ const meJid = credentials?.meJid;
716
+ return !!meJid && parseSignalAddressFromJid(meJid).user === senderUser;
717
+ }
718
+ enqueuePlaceholderResend(context) {
719
+ if (!this.deps.peerDataOperation || !this.deps.emitIncomingMessage) {
720
+ return false;
721
+ }
722
+ const subtype = context.messageNode.attrs.subtype;
723
+ if (typeof subtype === 'string' && PLACEHOLDER_RESEND_SKIP_SUBTYPES.has(subtype)) {
724
+ return false;
725
+ }
726
+ const timestampSeconds = context.t ? Number(context.t) : Date.now() / 1000;
727
+ if (Number.isFinite(timestampSeconds)) {
728
+ const ageSeconds = Date.now() / 1000 - timestampSeconds;
729
+ if (ageSeconds > PLACEHOLDER_RESEND_MAX_AGE_SECONDS) {
730
+ return false;
731
+ }
732
+ }
733
+ if (this.placeholderInFlight.has(context.stanzaId)) {
734
+ return true;
735
+ }
736
+ if (this.placeholderInFlight.size >= PLACEHOLDER_RESEND_IN_FLIGHT_MAX) {
737
+ this.deps.logger.warn('placeholder resend: in-flight set saturated, dropping enqueue', {
738
+ id: context.stanzaId,
739
+ maxInFlight: PLACEHOLDER_RESEND_IN_FLIGHT_MAX
740
+ });
741
+ return false;
742
+ }
743
+ this.placeholderInFlight.add(context.stanzaId);
744
+ this.placeholderQueue.push({
745
+ remoteJid: context.from,
746
+ id: context.stanzaId,
747
+ fromMe: this.isSenderFromOwnAccount(context),
748
+ participant: context.participant
749
+ });
750
+ if (this.placeholderTimer === null) {
751
+ this.placeholderTimer = setTimeout(() => {
752
+ this.placeholderTimer = null;
753
+ void this.flushPlaceholderBatch();
754
+ }, PLACEHOLDER_RESEND_DEBOUNCE_MS);
755
+ }
756
+ return true;
757
+ }
758
+ async flushPlaceholderBatch() {
759
+ const peerDataOperation = this.deps.peerDataOperation;
760
+ const emitIncomingMessage = this.deps.emitIncomingMessage;
761
+ if (!peerDataOperation || !emitIncomingMessage) {
762
+ this.placeholderQueue = [];
763
+ this.placeholderInFlight.clear();
764
+ return;
765
+ }
766
+ while (this.placeholderQueue.length > 0) {
767
+ const batch = this.placeholderQueue.splice(0, PLACEHOLDER_RESEND_BATCH_SIZE);
768
+ try {
769
+ const results = await peerDataOperation.request(proto.Message.PeerDataOperationRequestType.PLACEHOLDER_MESSAGE_RESEND, {
770
+ placeholderMessageResendRequest: batch.map((item) => ({
771
+ messageKey: {
772
+ remoteJid: item.remoteJid,
773
+ id: item.id,
774
+ fromMe: item.fromMe,
775
+ participant: item.participant
776
+ }
777
+ }))
778
+ });
779
+ for (const result of results) {
780
+ const bytes = result.placeholderMessageResendResponse?.webMessageInfoBytes;
781
+ if (!bytes) {
782
+ continue;
783
+ }
784
+ try {
785
+ const recovered = proto.WebMessageInfo.decode(bytes);
786
+ emitIncomingMessage(buildRecoveredIncomingEvent(recovered));
787
+ }
788
+ catch (error) {
789
+ this.deps.logger.warn('placeholder resend: failed to decode WebMessageInfo', {
790
+ message: toError(error).message
791
+ });
792
+ }
793
+ }
794
+ }
795
+ catch (error) {
796
+ this.deps.logger.warn('placeholder resend: request failed', {
797
+ batchSize: batch.length,
798
+ message: toError(error).message
799
+ });
800
+ }
801
+ finally {
802
+ for (const item of batch) {
803
+ this.placeholderInFlight.delete(item.id);
804
+ }
805
+ }
806
+ }
807
+ }
677
808
  }