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