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