zapo-js 0.1.2 → 0.3.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 (630) hide show
  1. package/README.md +16 -4
  2. package/dist/appstate/WaAppStateCrypto.js +50 -42
  3. package/dist/appstate/WaAppStateSyncClient.js +215 -133
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +9 -7
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +55 -57
  8. package/dist/auth/credentials-flow.js +195 -0
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingFlow.js +39 -32
  11. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
  12. package/dist/client/WaClient.js +338 -174
  13. package/dist/client/WaClientFactory.js +399 -66
  14. package/dist/client/connection/WaConnectionManager.js +23 -11
  15. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  16. package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
  17. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
  21. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  22. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  23. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  24. package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
  25. package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
  26. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  27. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
  28. package/dist/client/dirty.js +41 -21
  29. package/dist/client/events/abprops.js +43 -0
  30. package/dist/client/events/devices.js +72 -0
  31. package/dist/client/events/group.js +3 -11
  32. package/dist/client/events/identity.js +22 -0
  33. package/dist/client/events/privacy-token.js +38 -0
  34. package/dist/client/events/registration.js +42 -0
  35. package/dist/client/history-sync.js +50 -9
  36. package/dist/client/incoming.js +74 -7
  37. package/dist/client/mailbox.js +40 -23
  38. package/dist/client/media.js +243 -0
  39. package/dist/client/messages.js +245 -92
  40. package/dist/client/messaging/fanout.js +21 -11
  41. package/dist/client/messaging/participants.js +6 -4
  42. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  43. package/dist/client/tokens/cs-token.js +50 -0
  44. package/dist/client/tokens/tc-token.js +25 -0
  45. package/dist/crypto/core/index.js +5 -2
  46. package/dist/crypto/core/keys.js +4 -4
  47. package/dist/crypto/core/nonce.js +2 -0
  48. package/dist/crypto/core/primitives.js +0 -8
  49. package/dist/crypto/core/random.js +24 -8
  50. package/dist/crypto/core/xeddsa.js +57 -0
  51. package/dist/crypto/curves/X25519.js +43 -6
  52. package/dist/crypto/curves/constants.js +2 -1
  53. package/dist/crypto/index.js +3 -0
  54. package/dist/crypto/math/constants.js +13 -36
  55. package/dist/crypto/math/edwards.js +171 -44
  56. package/dist/crypto/math/fe.js +706 -0
  57. package/dist/crypto/math/mod.js +10 -3
  58. package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
  59. package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
  60. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  61. package/dist/esm/appstate/index.js +2 -2
  62. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  63. package/dist/esm/appstate/utils.js +2 -5
  64. package/dist/esm/auth/WaAuthClient.js +52 -54
  65. package/dist/esm/auth/credentials-flow.js +190 -0
  66. package/dist/esm/auth/index.js +0 -2
  67. package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
  68. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
  69. package/dist/esm/client/WaClient.js +339 -175
  70. package/dist/esm/client/WaClientFactory.js +401 -68
  71. package/dist/esm/client/connection/WaConnectionManager.js +23 -11
  72. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  73. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
  74. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  75. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  76. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
  77. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
  78. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  79. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  80. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  81. package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
  82. package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
  83. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  84. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
  85. package/dist/esm/client/dirty.js +41 -21
  86. package/dist/esm/client/events/abprops.js +40 -0
  87. package/dist/esm/client/events/devices.js +68 -0
  88. package/dist/esm/client/events/group.js +3 -11
  89. package/dist/esm/client/events/identity.js +19 -0
  90. package/dist/esm/client/events/privacy-token.js +35 -0
  91. package/dist/esm/client/events/registration.js +39 -0
  92. package/dist/esm/client/history-sync.js +50 -9
  93. package/dist/esm/client/incoming.js +74 -8
  94. package/dist/esm/client/mailbox.js +40 -23
  95. package/dist/esm/client/media.js +234 -0
  96. package/dist/esm/client/messages.js +244 -91
  97. package/dist/esm/client/messaging/fanout.js +22 -12
  98. package/dist/esm/client/messaging/participants.js +6 -4
  99. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  100. package/dist/esm/client/tokens/cs-token.js +46 -0
  101. package/dist/esm/client/tokens/tc-token.js +18 -0
  102. package/dist/esm/crypto/core/index.js +3 -2
  103. package/dist/esm/crypto/core/keys.js +1 -1
  104. package/dist/esm/crypto/core/nonce.js +2 -0
  105. package/dist/esm/crypto/core/primitives.js +0 -7
  106. package/dist/esm/crypto/core/random.js +23 -7
  107. package/dist/esm/crypto/core/xeddsa.js +53 -0
  108. package/dist/esm/crypto/curves/X25519.js +45 -8
  109. package/dist/esm/crypto/curves/constants.js +1 -0
  110. package/dist/esm/crypto/index.js +1 -0
  111. package/dist/esm/crypto/math/constants.js +12 -35
  112. package/dist/esm/crypto/math/edwards.js +174 -47
  113. package/dist/esm/crypto/math/fe.js +691 -0
  114. package/dist/esm/crypto/math/mod.js +10 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  117. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  118. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  119. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  120. package/dist/esm/infra/perf/StoreLock.js +80 -0
  121. package/dist/esm/media/WaMediaCrypto.js +332 -55
  122. package/dist/esm/media/WaMediaTransferClient.js +69 -220
  123. package/dist/esm/media/constants.js +4 -1
  124. package/dist/esm/media/processor.js +1 -0
  125. package/dist/esm/message/WaMessageClient.js +26 -19
  126. package/dist/esm/message/addon-crypto.js +130 -3
  127. package/dist/esm/message/content.js +206 -14
  128. package/dist/esm/message/icdc.js +76 -0
  129. package/dist/esm/message/incoming.js +38 -24
  130. package/dist/esm/message/phash.js +35 -13
  131. package/dist/esm/message/reporting-token.js +17 -30
  132. package/dist/esm/message/use-case-secret.js +1 -1
  133. package/dist/esm/protocol/abprops.js +159 -0
  134. package/dist/esm/protocol/appstate.js +9 -40
  135. package/dist/esm/protocol/browser.js +24 -18
  136. package/dist/esm/protocol/constants.js +8 -4
  137. package/dist/esm/protocol/defaults.js +6 -0
  138. package/dist/esm/protocol/email.js +30 -0
  139. package/dist/esm/protocol/index.js +1 -2
  140. package/dist/esm/protocol/jid.js +142 -39
  141. package/dist/esm/protocol/message.js +61 -1
  142. package/dist/esm/protocol/nodes.js +8 -2
  143. package/dist/esm/protocol/notification.js +9 -1
  144. package/dist/esm/protocol/privacy-token.js +17 -0
  145. package/dist/esm/protocol/privacy.js +55 -0
  146. package/dist/esm/protocol/stream.js +26 -1
  147. package/dist/esm/retry/codec.js +216 -0
  148. package/dist/esm/retry/constants.js +1 -1
  149. package/dist/esm/retry/index.js +2 -2
  150. package/dist/esm/retry/parse.js +50 -30
  151. package/dist/esm/retry/reason.js +1 -1
  152. package/dist/esm/retry/replay.js +11 -7
  153. package/dist/esm/retry/tracker.js +50 -12
  154. package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
  155. package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
  156. package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
  157. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
  158. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  159. package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
  160. package/dist/esm/signal/api/result-map.js +10 -0
  161. package/dist/esm/signal/constants.js +0 -4
  162. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
  163. package/dist/esm/signal/crypto/constants.js +0 -4
  164. package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
  165. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  166. package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
  167. package/dist/esm/signal/group/SenderKeyManager.js +131 -109
  168. package/dist/esm/signal/index.js +1 -0
  169. package/dist/esm/signal/registration/keygen.js +8 -5
  170. package/dist/esm/signal/registration/utils.js +3 -2
  171. package/dist/esm/signal/session/SignalProtocol.js +158 -81
  172. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  173. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  174. package/dist/esm/signal/session/SignalSession.js +11 -9
  175. package/dist/esm/signal/session/resolver.js +140 -105
  176. package/dist/esm/store/contracts/identity.store.js +1 -0
  177. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  178. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  179. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  180. package/dist/esm/store/contracts/session.store.js +1 -0
  181. package/dist/esm/store/createStore.js +143 -193
  182. package/dist/esm/store/index.js +5 -10
  183. package/dist/esm/store/locks/appstate.lock.js +26 -0
  184. package/dist/esm/store/locks/auth.lock.js +15 -0
  185. package/dist/esm/store/locks/contact.lock.js +20 -0
  186. package/dist/esm/store/locks/device-list.lock.js +20 -0
  187. package/dist/esm/store/locks/identity.lock.js +16 -0
  188. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  189. package/dist/esm/store/locks/message.lock.js +21 -0
  190. package/dist/esm/store/locks/participants.lock.js +20 -0
  191. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  192. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  193. package/dist/esm/store/locks/retry.lock.js +29 -0
  194. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  195. package/dist/esm/store/locks/session.lock.js +19 -0
  196. package/dist/esm/store/locks/signal.lock.js +39 -0
  197. package/dist/esm/store/locks/thread.lock.js +21 -0
  198. package/dist/esm/store/noop.store.js +21 -1
  199. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  200. package/dist/esm/store/providers/memory/device-list.store.js +13 -5
  201. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  202. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  203. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  204. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  205. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  206. package/dist/esm/store/providers/memory/retry.store.js +99 -10
  207. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  208. package/dist/esm/store/providers/memory/session.store.js +45 -0
  209. package/dist/esm/store/providers/memory/signal.store.js +1 -147
  210. package/dist/esm/transport/WaComms.js +7 -4
  211. package/dist/esm/transport/WaWebSocket.js +9 -7
  212. package/dist/esm/transport/binary/constants.js +0 -30
  213. package/dist/esm/transport/binary/decoder.js +4 -4
  214. package/dist/esm/transport/binary/encoder.js +8 -15
  215. package/dist/esm/transport/binary/index.js +0 -1
  216. package/dist/esm/transport/index.js +6 -0
  217. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  218. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  219. package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
  220. package/dist/esm/transport/node/builders/abprops.js +20 -0
  221. package/dist/esm/transport/node/builders/business.js +129 -0
  222. package/dist/esm/transport/node/builders/device.js +11 -0
  223. package/dist/esm/transport/node/builders/email.js +65 -0
  224. package/dist/esm/transport/node/builders/global.js +370 -0
  225. package/dist/esm/transport/node/builders/message.js +63 -239
  226. package/dist/esm/transport/node/builders/offline.js +14 -0
  227. package/dist/esm/transport/node/builders/pairing.js +0 -24
  228. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  229. package/dist/esm/transport/node/builders/presence.js +13 -0
  230. package/dist/esm/transport/node/builders/privacy-token.js +37 -0
  231. package/dist/esm/transport/node/builders/privacy.js +48 -0
  232. package/dist/esm/transport/node/builders/profile.js +70 -0
  233. package/dist/esm/transport/node/builders/retry.js +11 -23
  234. package/dist/esm/transport/node/builders/usync.js +6 -2
  235. package/dist/esm/transport/node/helpers.js +43 -1
  236. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  237. package/dist/esm/transport/node/mex/client.js +83 -0
  238. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  239. package/dist/esm/transport/node/usync.js +3 -33
  240. package/dist/esm/transport/node/xml.js +35 -14
  241. package/dist/esm/transport/noise/WaClientPayload.js +24 -19
  242. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  243. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  244. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  245. package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
  246. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  247. package/dist/esm/transport/stream/parse.js +8 -4
  248. package/dist/esm/util/bytes.js +22 -18
  249. package/dist/esm/util/index.js +5 -0
  250. package/dist/esm/util/primitives.js +3 -2
  251. package/dist/index.js +7 -1
  252. package/dist/infra/perf/BackgroundQueue.js +482 -0
  253. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  254. package/dist/infra/perf/PromiseDedup.js +24 -0
  255. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  256. package/dist/infra/perf/StoreLock.js +84 -0
  257. package/dist/media/WaMediaCrypto.js +328 -51
  258. package/dist/media/WaMediaTransferClient.js +72 -253
  259. package/dist/media/constants.js +5 -2
  260. package/dist/media/processor.js +2 -0
  261. package/dist/message/WaMessageClient.js +26 -19
  262. package/dist/message/addon-crypto.js +131 -0
  263. package/dist/message/content.js +211 -14
  264. package/dist/message/icdc.js +81 -0
  265. package/dist/message/incoming.js +38 -24
  266. package/dist/message/phash.js +35 -13
  267. package/dist/message/reporting-token.js +16 -30
  268. package/dist/message/use-case-secret.js +1 -1
  269. package/dist/protocol/abprops.js +163 -0
  270. package/dist/protocol/appstate.js +10 -41
  271. package/dist/protocol/browser.js +25 -18
  272. package/dist/protocol/constants.js +33 -2
  273. package/dist/protocol/defaults.js +6 -0
  274. package/dist/protocol/email.js +33 -0
  275. package/dist/protocol/index.js +8 -5
  276. package/dist/protocol/jid.js +149 -39
  277. package/dist/protocol/message.js +62 -2
  278. package/dist/protocol/nodes.js +8 -2
  279. package/dist/protocol/notification.js +10 -2
  280. package/dist/protocol/privacy-token.js +20 -0
  281. package/dist/protocol/privacy.js +58 -0
  282. package/dist/protocol/stream.js +27 -2
  283. package/dist/retry/codec.js +220 -0
  284. package/dist/retry/constants.js +1 -1
  285. package/dist/retry/index.js +5 -5
  286. package/dist/retry/parse.js +51 -30
  287. package/dist/retry/reason.js +1 -1
  288. package/dist/retry/replay.js +10 -6
  289. package/dist/retry/tracker.js +50 -12
  290. package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
  291. package/dist/signal/api/SignalDigestSyncApi.js +21 -15
  292. package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
  293. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  294. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  295. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  296. package/dist/signal/api/result-map.js +13 -0
  297. package/dist/signal/constants.js +1 -5
  298. package/dist/signal/crypto/WaAdvSignature.js +2 -44
  299. package/dist/signal/crypto/constants.js +1 -5
  300. package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
  301. package/dist/signal/group/SenderKeyChain.js +2 -2
  302. package/dist/signal/group/SenderKeyCodec.js +8 -8
  303. package/dist/signal/group/SenderKeyManager.js +130 -108
  304. package/dist/signal/index.js +13 -1
  305. package/dist/signal/registration/keygen.js +7 -4
  306. package/dist/signal/registration/utils.js +3 -2
  307. package/dist/signal/session/SignalProtocol.js +158 -81
  308. package/dist/signal/session/SignalRatchet.js +19 -8
  309. package/dist/signal/session/SignalSerializer.js +5 -6
  310. package/dist/signal/session/SignalSession.js +11 -9
  311. package/dist/signal/session/resolver.js +138 -103
  312. package/dist/store/contracts/identity.store.js +2 -0
  313. package/dist/store/contracts/message-secret.store.js +2 -0
  314. package/dist/store/contracts/pre-key.store.js +2 -0
  315. package/dist/store/contracts/privacy-token.store.js +2 -0
  316. package/dist/store/contracts/session.store.js +2 -0
  317. package/dist/store/createStore.js +142 -192
  318. package/dist/store/index.js +23 -33
  319. package/dist/store/locks/appstate.lock.js +29 -0
  320. package/dist/store/locks/auth.lock.js +18 -0
  321. package/dist/store/locks/contact.lock.js +23 -0
  322. package/dist/store/locks/device-list.lock.js +23 -0
  323. package/dist/store/locks/identity.lock.js +19 -0
  324. package/dist/store/locks/message-secret.lock.js +20 -0
  325. package/dist/store/locks/message.lock.js +24 -0
  326. package/dist/store/locks/participants.lock.js +23 -0
  327. package/dist/store/locks/pre-key.lock.js +30 -0
  328. package/dist/store/locks/privacy-token.lock.js +21 -0
  329. package/dist/store/locks/retry.lock.js +32 -0
  330. package/dist/store/locks/sender-key.lock.js +55 -0
  331. package/dist/store/locks/session.lock.js +22 -0
  332. package/dist/store/locks/signal.lock.js +42 -0
  333. package/dist/store/locks/thread.lock.js +24 -0
  334. package/dist/store/noop.store.js +22 -2
  335. package/dist/store/providers/memory/appstate.store.js +22 -24
  336. package/dist/store/providers/memory/device-list.store.js +13 -5
  337. package/dist/store/providers/memory/identity.store.js +35 -0
  338. package/dist/store/providers/memory/message-secret.store.js +85 -0
  339. package/dist/store/providers/memory/participants.store.js +3 -0
  340. package/dist/store/providers/memory/pre-key.store.js +101 -0
  341. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  342. package/dist/store/providers/memory/retry.store.js +98 -9
  343. package/dist/store/providers/memory/sender-key.store.js +6 -1
  344. package/dist/store/providers/memory/session.store.js +49 -0
  345. package/dist/store/providers/memory/signal.store.js +1 -147
  346. package/dist/transport/WaComms.js +7 -4
  347. package/dist/transport/WaWebSocket.js +9 -7
  348. package/dist/transport/binary/constants.js +1 -31
  349. package/dist/transport/binary/decoder.js +4 -4
  350. package/dist/transport/binary/encoder.js +8 -15
  351. package/dist/transport/binary/index.js +0 -4
  352. package/dist/transport/index.js +17 -1
  353. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  354. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  355. package/dist/transport/node/WaNodeOrchestrator.js +36 -21
  356. package/dist/transport/node/builders/abprops.js +23 -0
  357. package/dist/transport/node/builders/business.js +137 -0
  358. package/dist/transport/node/builders/device.js +14 -0
  359. package/dist/transport/node/builders/email.js +72 -0
  360. package/dist/transport/node/builders/global.js +375 -0
  361. package/dist/transport/node/builders/message.js +64 -245
  362. package/dist/transport/node/builders/offline.js +17 -0
  363. package/dist/transport/node/builders/pairing.js +0 -26
  364. package/dist/transport/node/builders/prekeys.js +36 -39
  365. package/dist/transport/node/builders/presence.js +16 -0
  366. package/dist/transport/node/builders/privacy-token.js +42 -0
  367. package/dist/transport/node/builders/privacy.js +55 -0
  368. package/dist/transport/node/builders/profile.js +78 -0
  369. package/dist/transport/node/builders/retry.js +10 -22
  370. package/dist/transport/node/builders/usync.js +6 -2
  371. package/dist/transport/node/helpers.js +46 -1
  372. package/dist/transport/node/mex/argo-decoder.js +189 -0
  373. package/dist/transport/node/mex/client.js +86 -0
  374. package/dist/transport/node/mex/persist-ids.js +13 -0
  375. package/dist/transport/node/usync.js +2 -32
  376. package/dist/transport/node/xml.js +35 -14
  377. package/dist/transport/noise/WaClientPayload.js +26 -21
  378. package/dist/transport/noise/WaFrameCodec.js +1 -1
  379. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  380. package/dist/transport/noise/WaNoiseCert.js +8 -26
  381. package/dist/transport/noise/WaNoiseSession.js +75 -33
  382. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  383. package/dist/transport/stream/parse.js +7 -3
  384. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  385. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  386. package/dist/types/appstate/encoding.d.ts +7 -0
  387. package/dist/types/appstate/index.d.ts +3 -3
  388. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  389. package/dist/types/appstate/types.d.ts +1 -1
  390. package/dist/types/appstate/utils.d.ts +0 -2
  391. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  392. package/dist/types/auth/credentials-flow.d.ts +20 -0
  393. package/dist/types/auth/index.d.ts +0 -2
  394. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  395. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  396. package/dist/types/auth/types.d.ts +41 -0
  397. package/dist/types/client/WaClient.d.ts +44 -18
  398. package/dist/types/client/WaClientFactory.d.ts +22 -8
  399. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  400. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  401. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  402. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  403. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
  404. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
  405. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  406. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
  407. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  408. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
  409. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
  410. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  411. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
  412. package/dist/types/client/dirty.d.ts +3 -1
  413. package/dist/types/client/events/abprops.d.ts +14 -0
  414. package/dist/types/client/events/devices.d.ts +20 -0
  415. package/dist/types/client/events/identity.d.ts +9 -0
  416. package/dist/types/client/events/privacy-token.d.ts +7 -0
  417. package/dist/types/client/events/registration.d.ts +17 -0
  418. package/dist/types/client/history-sync.d.ts +9 -6
  419. package/dist/types/client/incoming.d.ts +9 -2
  420. package/dist/types/client/index.d.ts +1 -1
  421. package/dist/types/client/mailbox.d.ts +5 -5
  422. package/dist/types/client/media.d.ts +31 -0
  423. package/dist/types/client/messages.d.ts +3 -2
  424. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  425. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  426. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  427. package/dist/types/client/types.d.ts +151 -4
  428. package/dist/types/crypto/core/index.d.ts +3 -2
  429. package/dist/types/crypto/core/nonce.d.ts +2 -0
  430. package/dist/types/crypto/core/primitives.d.ts +1 -2
  431. package/dist/types/crypto/core/random.d.ts +2 -1
  432. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  433. package/dist/types/crypto/curves/constants.d.ts +1 -0
  434. package/dist/types/crypto/index.d.ts +2 -0
  435. package/dist/types/crypto/math/constants.d.ts +4 -2
  436. package/dist/types/crypto/math/fe.d.ts +30 -0
  437. package/dist/types/crypto/math/mod.d.ts +0 -2
  438. package/dist/types/crypto/math/types.d.ts +11 -4
  439. package/dist/types/index.d.ts +6 -3
  440. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  441. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  442. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  443. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  444. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  445. package/dist/types/infra/perf/StoreLock.d.ts +11 -0
  446. package/dist/types/media/WaMediaCrypto.d.ts +16 -6
  447. package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
  448. package/dist/types/media/constants.d.ts +3 -1
  449. package/dist/types/media/index.d.ts +2 -1
  450. package/dist/types/media/processor.d.ts +28 -0
  451. package/dist/types/media/types.d.ts +19 -5
  452. package/dist/types/message/addon-crypto.d.ts +34 -3
  453. package/dist/types/message/content.d.ts +11 -1
  454. package/dist/types/message/icdc.d.ts +13 -0
  455. package/dist/types/message/reporting-token.d.ts +0 -1
  456. package/dist/types/message/types.d.ts +42 -11
  457. package/dist/types/protocol/abprops.d.ts +142 -0
  458. package/dist/types/protocol/appstate.d.ts +0 -11
  459. package/dist/types/protocol/browser.d.ts +1 -0
  460. package/dist/types/protocol/constants.d.ts +12 -4
  461. package/dist/types/protocol/defaults.d.ts +6 -0
  462. package/dist/types/protocol/email.d.ts +32 -0
  463. package/dist/types/protocol/index.d.ts +1 -2
  464. package/dist/types/protocol/jid.d.ts +20 -2
  465. package/dist/types/protocol/message.d.ts +60 -0
  466. package/dist/types/protocol/nodes.d.ts +6 -0
  467. package/dist/types/protocol/notification.d.ts +8 -0
  468. package/dist/types/protocol/privacy-token.d.ts +17 -0
  469. package/dist/types/protocol/privacy.d.ts +75 -0
  470. package/dist/types/protocol/stream.d.ts +31 -0
  471. package/dist/types/retry/codec.d.ts +3 -0
  472. package/dist/types/retry/index.d.ts +3 -3
  473. package/dist/types/retry/parse.d.ts +5 -2
  474. package/dist/types/retry/reason.d.ts +1 -1
  475. package/dist/types/retry/tracker.d.ts +1 -0
  476. package/dist/types/retry/types.d.ts +6 -1
  477. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  478. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
  479. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
  480. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  481. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  482. package/dist/types/signal/api/result-map.d.ts +1 -0
  483. package/dist/types/signal/constants.d.ts +0 -3
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  485. package/dist/types/signal/crypto/constants.d.ts +0 -1
  486. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
  487. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
  489. package/dist/types/signal/index.d.ts +2 -0
  490. package/dist/types/signal/registration/utils.d.ts +2 -1
  491. package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
  492. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  493. package/dist/types/signal/session/resolver.d.ts +11 -4
  494. package/dist/types/signal/types.d.ts +16 -4
  495. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  496. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  497. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  498. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  499. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  500. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  501. package/dist/types/store/contracts/session.store.d.ts +14 -0
  502. package/dist/types/store/contracts/signal.store.d.ts +1 -27
  503. package/dist/types/store/createStore.d.ts +1 -1
  504. package/dist/types/store/index.d.ts +12 -12
  505. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  506. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  507. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  508. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  509. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  510. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  511. package/dist/types/store/locks/message.lock.d.ts +3 -0
  512. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  513. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  514. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  515. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  516. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  517. package/dist/types/store/locks/session.lock.d.ts +3 -0
  518. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  519. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  520. package/dist/types/store/noop.store.d.ts +4 -0
  521. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  522. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  523. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  524. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  525. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  526. package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
  527. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  528. package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
  529. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  530. package/dist/types/store/types.d.ts +69 -61
  531. package/dist/types/transport/WaWebSocket.d.ts +1 -1
  532. package/dist/types/transport/binary/constants.d.ts +0 -30
  533. package/dist/types/transport/binary/index.d.ts +0 -1
  534. package/dist/types/transport/index.d.ts +8 -1
  535. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  536. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  537. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
  538. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  539. package/dist/types/transport/node/builders/business.d.ts +29 -0
  540. package/dist/types/transport/node/builders/device.d.ts +2 -0
  541. package/dist/types/transport/node/builders/email.d.ts +11 -0
  542. package/dist/types/transport/node/builders/global.d.ts +102 -0
  543. package/dist/types/transport/node/builders/message.d.ts +8 -7
  544. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  545. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  546. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  547. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  548. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  549. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  550. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  551. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  552. package/dist/types/transport/node/helpers.d.ts +8 -0
  553. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  554. package/dist/types/transport/node/mex/client.d.ts +18 -0
  555. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  556. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  557. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  558. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  559. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  560. package/dist/types/transport/types.d.ts +8 -0
  561. package/dist/types/util/bytes.d.ts +1 -1
  562. package/dist/types/util/index.d.ts +5 -0
  563. package/dist/types/util/primitives.d.ts +0 -1
  564. package/dist/util/bytes.js +22 -18
  565. package/dist/util/index.js +23 -0
  566. package/dist/util/primitives.js +2 -2
  567. package/package.json +34 -10
  568. package/proto/index.js +1 -1
  569. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  570. package/dist/auth/pairing/constants.js +0 -5
  571. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  572. package/dist/crypto/core/constants.js +0 -4
  573. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  574. package/dist/esm/auth/pairing/constants.js +0 -2
  575. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  576. package/dist/esm/crypto/core/constants.js +0 -1
  577. package/dist/esm/retry/outbound.js +0 -82
  578. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  579. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  580. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  581. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  582. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  583. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  584. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  585. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  586. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  587. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  588. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  589. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  590. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  591. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  592. package/dist/esm/transport/node/builders/index.js +0 -8
  593. package/dist/retry/outbound.js +0 -87
  594. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  595. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  596. package/dist/store/providers/sqlite/auth.store.js +0 -180
  597. package/dist/store/providers/sqlite/connection.js +0 -281
  598. package/dist/store/providers/sqlite/contact.store.js +0 -78
  599. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  600. package/dist/store/providers/sqlite/message.store.js +0 -136
  601. package/dist/store/providers/sqlite/migrations.js +0 -350
  602. package/dist/store/providers/sqlite/participants.store.js +0 -81
  603. package/dist/store/providers/sqlite/retry.store.js +0 -145
  604. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  605. package/dist/store/providers/sqlite/signal.store.js +0 -439
  606. package/dist/store/providers/sqlite/table-names.js +0 -113
  607. package/dist/store/providers/sqlite/thread.store.js +0 -89
  608. package/dist/transport/node/builders/index.js +0 -42
  609. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  610. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  611. package/dist/types/auth/pairing/constants.d.ts +0 -2
  612. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  613. package/dist/types/crypto/core/constants.d.ts +0 -1
  614. package/dist/types/retry/outbound.d.ts +0 -4
  615. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  616. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  617. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  618. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  619. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  620. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  621. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  622. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  623. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  624. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  625. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  626. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  627. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  628. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
  629. package/dist/types/transport/node/builders/index.d.ts +0 -8
  630. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -11,6 +11,66 @@ export const WA_MESSAGE_TYPES = Object.freeze({
11
11
  ACK_TYPE_ERROR: 'error',
12
12
  ACK_CLASS_ERROR: 'error',
13
13
  ACK_CLASS_MESSAGE: 'message',
14
- RECEIPT_TYPE_PEER: 'peer_msg'
14
+ RECEIPT_TYPE_DELIVERY: 'delivery',
15
+ RECEIPT_TYPE_SENDER: 'sender',
16
+ RECEIPT_TYPE_INACTIVE: 'inactive',
17
+ RECEIPT_TYPE_READ: 'read',
18
+ RECEIPT_TYPE_READ_SELF: 'read-self',
19
+ RECEIPT_TYPE_PLAYED: 'played',
20
+ RECEIPT_TYPE_PLAYED_SELF: 'played-self',
21
+ RECEIPT_TYPE_HISTORY_SYNC: 'hist_sync',
22
+ RECEIPT_TYPE_PEER: 'peer_msg',
23
+ RECEIPT_TYPE_SERVER_ERROR: 'server-error',
24
+ RECEIPT_TYPE_RETRY: 'retry'
15
25
  });
16
26
  export const WA_RETRYABLE_ACK_CODES = Object.freeze(['408', '429', '500', '503']);
27
+ export const WA_STANZA_MSG_TYPES = Object.freeze({
28
+ TEXT: 'text',
29
+ MEDIA: 'media',
30
+ MEDIA_NOTIFY: 'medianotify',
31
+ PAY: 'pay',
32
+ POLL: 'poll',
33
+ REACTION: 'reaction',
34
+ EVENT: 'event'
35
+ });
36
+ export const WA_EDIT_ATTRS = Object.freeze({
37
+ MESSAGE_EDIT: '1',
38
+ PIN_IN_CHAT: '2',
39
+ SENDER_REVOKE: '7',
40
+ ADMIN_REVOKE: '8'
41
+ });
42
+ export const WA_POLL_META_TYPES = Object.freeze({
43
+ CREATION: 'creation',
44
+ VOTE: 'vote',
45
+ RESULT_SNAPSHOT: 'result_snapshot',
46
+ EDIT: 'edit'
47
+ });
48
+ export const WA_EVENT_META_TYPES = Object.freeze({
49
+ CREATION: 'creation',
50
+ RESPONSE: 'response',
51
+ EDIT: 'edit'
52
+ });
53
+ export const WA_ENC_MEDIA_TYPES = Object.freeze({
54
+ IMAGE: 'image',
55
+ VIDEO: 'video',
56
+ PTV: 'ptv',
57
+ AUDIO: 'audio',
58
+ PTT: 'ptt',
59
+ LOCATION: 'location',
60
+ LIVE_LOCATION: 'livelocation',
61
+ VCARD: 'vcard',
62
+ CONTACT_ARRAY: 'contact_array',
63
+ DOCUMENT: 'document',
64
+ URL: 'url',
65
+ GIF: 'gif',
66
+ STICKER: 'sticker',
67
+ STICKER_PACK: 'sticker_pack',
68
+ LIST: 'list',
69
+ LIST_RESPONSE: 'list_response',
70
+ BUTTON: 'button',
71
+ BUTTON_RESPONSE: 'buttons_response',
72
+ ORDER: 'order',
73
+ PRODUCT: 'product',
74
+ NATIVE_FLOW_RESPONSE: 'native_flow_response',
75
+ GROUP_HISTORY: 'group_history'
76
+ });
@@ -32,6 +32,7 @@ export const WA_NODE_TAGS = Object.freeze({
32
32
  DESCRIPTION: 'description',
33
33
  MY_ADDONS: 'my_addons',
34
34
  KEY: 'key',
35
+ OP: 'op',
35
36
  REGISTRATION: 'registration',
36
37
  TYPE: 'type',
37
38
  IDENTITY: 'identity',
@@ -60,7 +61,8 @@ export const WA_NODE_TAGS = Object.freeze({
60
61
  ANNOUNCEMENT: 'announcement',
61
62
  EPHEMERAL: 'ephemeral',
62
63
  MEMBERSHIP_APPROVAL_MODE: 'membership_approval_mode',
63
- GROUP_JOIN: 'group_join'
64
+ GROUP_JOIN: 'group_join',
65
+ ABPROPS: 'abprops'
64
66
  });
65
67
  export const WA_IQ_TYPES = Object.freeze({
66
68
  GET: 'get',
@@ -78,8 +80,12 @@ export const WA_XMLNS = Object.freeze({
78
80
  PRIVACY: 'privacy',
79
81
  BLOCKLIST: 'blocklist',
80
82
  USYNC: 'usync',
83
+ BUSINESS: 'w:biz',
84
+ STATUS: 'status',
81
85
  GROUPS: 'w:g2',
82
86
  NEWSLETTER: 'newsletter',
83
87
  XMPP_PING: 'urn:xmpp:ping',
84
- WHATSAPP_PING: 'w:p'
88
+ WHATSAPP_PING: 'w:p',
89
+ ABPROPS: 'abt',
90
+ MEX: 'w:mex'
85
91
  });
@@ -1,5 +1,13 @@
1
1
  export const WA_NOTIFICATION_TYPES = Object.freeze({
2
- GROUP: 'w:gp2'
2
+ GROUP: 'w:gp2',
3
+ ENCRYPT: 'encrypt',
4
+ DEVICES: 'devices',
5
+ SERVER: 'server',
6
+ REGISTRATION: 'registration'
7
+ });
8
+ export const WA_REGISTRATION_NOTIFICATION_TAGS = Object.freeze({
9
+ WA_OLD_REGISTRATION: 'wa_old_registration',
10
+ DEVICE_LOGOUT: 'device_logout'
3
11
  });
4
12
  export const WA_GROUP_NOTIFICATION_TAGS = Object.freeze({
5
13
  REMOVE: 'remove',
@@ -0,0 +1,17 @@
1
+ export const WA_PRIVACY_TOKEN_TYPES = Object.freeze({
2
+ TRUSTED_CONTACT: 'trusted_contact'
3
+ });
4
+ export const WA_PRIVACY_TOKEN_TAGS = Object.freeze({
5
+ TOKENS: 'tokens',
6
+ TOKEN: 'token',
7
+ TC_TOKEN: 'tctoken',
8
+ CS_TOKEN: 'cstoken'
9
+ });
10
+ export const WA_PRIVACY_TOKEN_NOTIFICATION_TYPE = 'privacy_token';
11
+ export const WA_TC_TOKEN_DEFAULTS = Object.freeze({
12
+ DURATION_S: 604800,
13
+ NUM_BUCKETS: 4,
14
+ SENDER_DURATION_S: 604800,
15
+ SENDER_NUM_BUCKETS: 4,
16
+ MAX_DURATION_S: 15552000
17
+ });
@@ -0,0 +1,55 @@
1
+ export const WA_PRIVACY_CATEGORIES = Object.freeze({
2
+ READ_RECEIPTS: 'readreceipts',
3
+ LAST_SEEN: 'last',
4
+ ONLINE: 'online',
5
+ PROFILE_PICTURE: 'profile',
6
+ ABOUT: 'status',
7
+ GROUP_ADD: 'groupadd',
8
+ CALL_ADD: 'calladd',
9
+ MESSAGES: 'messages',
10
+ DEFENSE_MODE: 'defense'
11
+ });
12
+ export const WA_PRIVACY_VALUES = Object.freeze({
13
+ ALL: 'all',
14
+ CONTACTS: 'contacts',
15
+ CONTACT_BLACKLIST: 'contact_blacklist',
16
+ NONE: 'none',
17
+ MATCH_LAST_SEEN: 'match_last_seen',
18
+ KNOWN: 'known',
19
+ OFF: 'off',
20
+ ON_STANDARD: 'on_standard',
21
+ ERROR: 'error'
22
+ });
23
+ export const WA_PRIVACY_CATEGORY_TO_SETTING = Object.freeze({
24
+ [WA_PRIVACY_CATEGORIES.READ_RECEIPTS]: 'readReceipts',
25
+ [WA_PRIVACY_CATEGORIES.LAST_SEEN]: 'lastSeen',
26
+ [WA_PRIVACY_CATEGORIES.ONLINE]: 'online',
27
+ [WA_PRIVACY_CATEGORIES.PROFILE_PICTURE]: 'profilePicture',
28
+ [WA_PRIVACY_CATEGORIES.ABOUT]: 'about',
29
+ [WA_PRIVACY_CATEGORIES.GROUP_ADD]: 'groupAdd',
30
+ [WA_PRIVACY_CATEGORIES.CALL_ADD]: 'callAdd',
31
+ [WA_PRIVACY_CATEGORIES.MESSAGES]: 'messages',
32
+ [WA_PRIVACY_CATEGORIES.DEFENSE_MODE]: 'defenseMode'
33
+ });
34
+ export const WA_PRIVACY_SETTING_TO_CATEGORY = Object.freeze({
35
+ readReceipts: WA_PRIVACY_CATEGORIES.READ_RECEIPTS,
36
+ lastSeen: WA_PRIVACY_CATEGORIES.LAST_SEEN,
37
+ online: WA_PRIVACY_CATEGORIES.ONLINE,
38
+ profilePicture: WA_PRIVACY_CATEGORIES.PROFILE_PICTURE,
39
+ about: WA_PRIVACY_CATEGORIES.ABOUT,
40
+ groupAdd: WA_PRIVACY_CATEGORIES.GROUP_ADD,
41
+ callAdd: WA_PRIVACY_CATEGORIES.CALL_ADD,
42
+ messages: WA_PRIVACY_CATEGORIES.MESSAGES,
43
+ defenseMode: WA_PRIVACY_CATEGORIES.DEFENSE_MODE
44
+ });
45
+ export const WA_PRIVACY_DISALLOWED_LIST_CATEGORIES = Object.freeze({
46
+ ABOUT: WA_PRIVACY_CATEGORIES.ABOUT,
47
+ GROUP_ADD: WA_PRIVACY_CATEGORIES.GROUP_ADD,
48
+ LAST_SEEN: WA_PRIVACY_CATEGORIES.LAST_SEEN,
49
+ PROFILE_PICTURE: WA_PRIVACY_CATEGORIES.PROFILE_PICTURE
50
+ });
51
+ export const WA_PRIVACY_TAGS = Object.freeze({
52
+ CATEGORY: 'category',
53
+ LIST: 'list',
54
+ USER: 'user'
55
+ });
@@ -49,6 +49,18 @@ export const WA_STREAM_SIGNALING = Object.freeze({
49
49
  FORCE_LOGIN_CODE: 515,
50
50
  FORCE_LOGOUT_CODE: 516
51
51
  });
52
+ export const WA_FAILURE_REASONS = Object.freeze({
53
+ GENERIC_FAILURE: 400,
54
+ NOT_AUTHORIZED: 401,
55
+ TEMP_BANNED: 402,
56
+ LOCKED: 403,
57
+ CLIENT_TOO_OLD: 405,
58
+ BANNED: 406,
59
+ BAD_USER_AGENT: 409,
60
+ INTERNAL_SERVER_ERROR: 500,
61
+ EXPERIMENTAL: 501,
62
+ SERVICE_UNAVAILABLE: 503
63
+ });
52
64
  export const WA_DISCONNECT_REASONS = Object.freeze({
53
65
  CLIENT_DISCONNECTED: 'client_disconnected',
54
66
  COMMS_STOPPED: 'comms_stopped',
@@ -56,5 +68,18 @@ export const WA_DISCONNECT_REASONS = Object.freeze({
56
68
  STREAM_ERROR_DEVICE_REMOVED: 'stream_error_device_removed',
57
69
  STREAM_ERROR_ACK: 'stream_error_ack',
58
70
  STREAM_ERROR_XML_NOT_WELL_FORMED: 'stream_error_xml_not_well_formed',
59
- STREAM_ERROR_OTHER: 'stream_error_other'
71
+ STREAM_ERROR_OTHER: 'stream_error_other',
72
+ STREAM_ERROR_FORCE_LOGIN: 'stream_error_force_login',
73
+ STREAM_ERROR_FORCE_LOGOUT: 'stream_error_force_logout',
74
+ FAILURE_LOCKED: 'failure_locked',
75
+ FAILURE_NOT_AUTHORIZED: 'failure_not_authorized',
76
+ FAILURE_BANNED: 'failure_banned',
77
+ FAILURE_CLIENT_TOO_OLD: 'failure_client_too_old',
78
+ FAILURE_BAD_USER_AGENT: 'failure_bad_user_agent',
79
+ FAILURE_SERVICE_UNAVAILABLE: 'failure_service_unavailable',
80
+ PRIMARY_IDENTITY_KEY_CHANGE: 'primary_identity_key_change'
81
+ });
82
+ export const WA_CONNECTION_REASONS = Object.freeze({
83
+ CONNECTED: 'connected',
84
+ RECONNECTED: 'reconnected'
60
85
  });
@@ -0,0 +1,216 @@
1
+ import { concatBytes, TEXT_DECODER, TEXT_ENCODER } from '../util/bytes.js';
2
+ const RETRY_PAYLOAD_CODEC_MAGIC = 0x5a;
3
+ const RETRY_PAYLOAD_CODEC_VERSION = 1;
4
+ const RETRY_PAYLOAD_MODE = Object.freeze({
5
+ plaintext: 1,
6
+ encrypted: 2,
7
+ opaque_node: 3
8
+ });
9
+ const RETRY_PAYLOAD_ENC_TYPE = Object.freeze({
10
+ msg: 1,
11
+ pkmsg: 2,
12
+ skmsg: 3
13
+ });
14
+ const RETRY_PAYLOAD_ENC_TYPE_REVERSE = Object.freeze({
15
+ 1: 'msg',
16
+ 2: 'pkmsg',
17
+ 3: 'skmsg'
18
+ });
19
+ export function encodeRetryReplayPayload(payload) {
20
+ const chunks = [];
21
+ if (payload.mode === 'plaintext') {
22
+ const header = new Uint8Array(3);
23
+ header[0] = RETRY_PAYLOAD_CODEC_MAGIC;
24
+ header[1] = RETRY_PAYLOAD_CODEC_VERSION;
25
+ header[2] = RETRY_PAYLOAD_MODE.plaintext;
26
+ chunks.push(header);
27
+ pushStringField(chunks, payload.to, 'to');
28
+ pushStringField(chunks, payload.type, 'type');
29
+ pushBytesField(chunks, payload.plaintext, 'plaintext');
30
+ return concatBytes(chunks);
31
+ }
32
+ if (payload.mode === 'encrypted') {
33
+ const header = new Uint8Array(3);
34
+ header[0] = RETRY_PAYLOAD_CODEC_MAGIC;
35
+ header[1] = RETRY_PAYLOAD_CODEC_VERSION;
36
+ header[2] = RETRY_PAYLOAD_MODE.encrypted;
37
+ chunks.push(header);
38
+ pushStringField(chunks, payload.to, 'to');
39
+ pushStringField(chunks, payload.type, 'type');
40
+ const hasParticipant = payload.participant !== undefined;
41
+ const modeDetails = new Uint8Array(2);
42
+ modeDetails[0] = RETRY_PAYLOAD_ENC_TYPE[payload.encType];
43
+ modeDetails[1] = hasParticipant ? 1 : 0;
44
+ chunks.push(modeDetails);
45
+ if (hasParticipant) {
46
+ pushStringField(chunks, payload.participant, 'participant');
47
+ }
48
+ pushBytesField(chunks, payload.ciphertext, 'ciphertext');
49
+ return concatBytes(chunks);
50
+ }
51
+ const header = new Uint8Array(3);
52
+ header[0] = RETRY_PAYLOAD_CODEC_MAGIC;
53
+ header[1] = RETRY_PAYLOAD_CODEC_VERSION;
54
+ header[2] = RETRY_PAYLOAD_MODE.opaque_node;
55
+ chunks.push(header);
56
+ pushBytesField(chunks, payload.node, 'node');
57
+ return concatBytes(chunks);
58
+ }
59
+ export function decodeRetryReplayPayload(raw) {
60
+ if (raw.byteLength < 3) {
61
+ throw new Error('invalid retry replay payload: unsupported codec version');
62
+ }
63
+ if (raw[0] !== RETRY_PAYLOAD_CODEC_MAGIC || raw[1] !== RETRY_PAYLOAD_CODEC_VERSION) {
64
+ throw new Error('invalid retry replay payload: unsupported codec version');
65
+ }
66
+ return decodeCompactRetryReplayPayload(raw);
67
+ }
68
+ function decodeEncryptedType(value) {
69
+ const result = RETRY_PAYLOAD_ENC_TYPE_REVERSE[value];
70
+ if (!result) {
71
+ throw new Error(`invalid retry encrypted encType code: ${value}`);
72
+ }
73
+ return result;
74
+ }
75
+ function pushUint16(chunks, value, field) {
76
+ if (!Number.isSafeInteger(value) || value < 0 || value > 0xffff) {
77
+ throw new Error(`invalid retry replay payload ${field} length`);
78
+ }
79
+ const out = new Uint8Array(2);
80
+ out[0] = value >>> 8;
81
+ out[1] = value & 0xff;
82
+ chunks.push(out);
83
+ }
84
+ function pushUint32(chunks, value, field) {
85
+ if (!Number.isSafeInteger(value) || value < 0 || value > 0xffffffff) {
86
+ throw new Error(`invalid retry replay payload ${field} length`);
87
+ }
88
+ const out = new Uint8Array(4);
89
+ out[0] = (value >>> 24) & 0xff;
90
+ out[1] = (value >>> 16) & 0xff;
91
+ out[2] = (value >>> 8) & 0xff;
92
+ out[3] = value & 0xff;
93
+ chunks.push(out);
94
+ }
95
+ function pushStringField(chunks, value, field) {
96
+ const encoded = TEXT_ENCODER.encode(value);
97
+ pushUint16(chunks, encoded.byteLength, field);
98
+ chunks.push(encoded);
99
+ }
100
+ function pushBytesField(chunks, value, field) {
101
+ pushUint32(chunks, value.byteLength, field);
102
+ chunks.push(value);
103
+ }
104
+ function readUint8(raw, offset, field) {
105
+ if (offset >= raw.byteLength) {
106
+ throw new Error(`invalid retry replay payload field: ${field}`);
107
+ }
108
+ return [raw[offset], offset + 1];
109
+ }
110
+ function readUint16(raw, offset, field) {
111
+ if (offset + 2 > raw.byteLength) {
112
+ throw new Error(`invalid retry replay payload field: ${field}`);
113
+ }
114
+ return [((raw[offset] << 8) | raw[offset + 1]) >>> 0, offset + 2];
115
+ }
116
+ function readUint32(raw, offset, field) {
117
+ if (offset + 4 > raw.byteLength) {
118
+ throw new Error(`invalid retry replay payload field: ${field}`);
119
+ }
120
+ return [
121
+ ((raw[offset] << 24) |
122
+ (raw[offset + 1] << 16) |
123
+ (raw[offset + 2] << 8) |
124
+ raw[offset + 3]) >>>
125
+ 0,
126
+ offset + 4
127
+ ];
128
+ }
129
+ function readString(raw, offset, field) {
130
+ const [byteLength, nextOffset] = readUint16(raw, offset, `${field}.length`);
131
+ const endOffset = nextOffset + byteLength;
132
+ if (endOffset > raw.byteLength) {
133
+ throw new Error(`invalid retry replay payload field: ${field}`);
134
+ }
135
+ return [TEXT_DECODER.decode(raw.subarray(nextOffset, endOffset)), endOffset];
136
+ }
137
+ function readBytes(raw, offset, field) {
138
+ const [byteLength, nextOffset] = readUint32(raw, offset, `${field}.length`);
139
+ const endOffset = nextOffset + byteLength;
140
+ if (endOffset > raw.byteLength) {
141
+ throw new Error(`invalid retry replay payload field: ${field}`);
142
+ }
143
+ return [raw.subarray(nextOffset, endOffset), endOffset];
144
+ }
145
+ function assertNoTrailingData(raw, offset) {
146
+ if (offset !== raw.byteLength) {
147
+ throw new Error('invalid retry replay payload: trailing data');
148
+ }
149
+ }
150
+ function decodeCompactRetryReplayPayload(raw) {
151
+ let offset = 0;
152
+ let magic = 0;
153
+ let version = 0;
154
+ let mode = 0;
155
+ [magic, offset] = readUint8(raw, offset, 'magic');
156
+ [version, offset] = readUint8(raw, offset, 'version');
157
+ [mode, offset] = readUint8(raw, offset, 'mode');
158
+ if (magic !== RETRY_PAYLOAD_CODEC_MAGIC || version !== RETRY_PAYLOAD_CODEC_VERSION) {
159
+ throw new Error('invalid retry replay payload: unsupported codec version');
160
+ }
161
+ if (mode === RETRY_PAYLOAD_MODE.plaintext) {
162
+ let to = '';
163
+ let type = '';
164
+ let plaintext = raw;
165
+ [to, offset] = readString(raw, offset, 'to');
166
+ [type, offset] = readString(raw, offset, 'type');
167
+ [plaintext, offset] = readBytes(raw, offset, 'plaintext');
168
+ assertNoTrailingData(raw, offset);
169
+ return {
170
+ mode: 'plaintext',
171
+ to,
172
+ type,
173
+ plaintext
174
+ };
175
+ }
176
+ if (mode === RETRY_PAYLOAD_MODE.encrypted) {
177
+ let to = '';
178
+ let type = '';
179
+ let encTypeCode = 0;
180
+ let hasParticipant = 0;
181
+ let participant;
182
+ let ciphertext = raw;
183
+ [to, offset] = readString(raw, offset, 'to');
184
+ [type, offset] = readString(raw, offset, 'type');
185
+ [encTypeCode, offset] = readUint8(raw, offset, 'encType');
186
+ [hasParticipant, offset] = readUint8(raw, offset, 'hasParticipant');
187
+ if (hasParticipant !== 0 && hasParticipant !== 1) {
188
+ throw new Error('invalid retry replay payload field: hasParticipant');
189
+ }
190
+ if (hasParticipant === 1) {
191
+ ;
192
+ [participant, offset] = readString(raw, offset, 'participant');
193
+ }
194
+ ;
195
+ [ciphertext, offset] = readBytes(raw, offset, 'ciphertext');
196
+ assertNoTrailingData(raw, offset);
197
+ return {
198
+ mode: 'encrypted',
199
+ to,
200
+ type,
201
+ encType: decodeEncryptedType(encTypeCode),
202
+ participant,
203
+ ciphertext
204
+ };
205
+ }
206
+ if (mode === RETRY_PAYLOAD_MODE.opaque_node) {
207
+ let node = raw;
208
+ [node, offset] = readBytes(raw, offset, 'node');
209
+ assertNoTrailingData(raw, offset);
210
+ return {
211
+ mode: 'opaque_node',
212
+ node
213
+ };
214
+ }
215
+ throw new Error(`invalid retry replay payload mode: ${mode}`);
216
+ }
@@ -1,6 +1,6 @@
1
1
  export const MAX_RETRY_ATTEMPTS = 5;
2
2
  export const RETRY_KEYS_MIN_COUNT = 2;
3
- export const RETRY_OUTBOUND_TTL_MS = 7 * 24 * 60 * 60 * 1000;
3
+ export const RETRY_OUTBOUND_TTL_MS = 60 * 1000;
4
4
  export const RETRY_RECEIPT_VERSION = '1';
5
5
  export const RETRY_REASON = Object.freeze({
6
6
  UnknownError: 0,
@@ -1,6 +1,6 @@
1
1
  export { MAX_RETRY_ATTEMPTS, RETRY_KEYS_MIN_COUNT, RETRY_OUTBOUND_TTL_MS, RETRY_REASON, RETRY_RECEIPT_VERSION } from './constants.js';
2
2
  export { mapRetryReasonFromError } from './reason.js';
3
- export { parseRetryReceiptRequest } from './parse.js';
4
- export { decodeRetryReplayPayload, encodeRetryReplayPayload, pickRetryStateMax } from './outbound.js';
3
+ export { parseRetryReceiptRequest, pickRetryStateMax } from './parse.js';
4
+ export { decodeRetryReplayPayload, encodeRetryReplayPayload } from './codec.js';
5
5
  export { WaRetryReplayService } from './replay.js';
6
6
  export { createOutboundRetryTracker } from './tracker.js';
@@ -1,34 +1,48 @@
1
1
  import { WA_MESSAGE_TAGS, WA_NODE_TAGS } from '../protocol/constants.js';
2
+ import { normalizeDeviceJid } from '../protocol/jid.js';
3
+ import { decodeExactLength, parseUint } from '../signal/api/codec.js';
2
4
  import { SIGNAL_KEY_DATA_LENGTH, SIGNAL_KEY_ID_LENGTH, SIGNAL_REGISTRATION_ID_LENGTH, SIGNAL_SIGNATURE_LENGTH } from '../signal/api/constants.js';
3
5
  import { decodeNodeContentBase64OrBytes, findNodeChildrenByTags } from '../transport/node/helpers.js';
4
6
  import { parseOptionalInt } from '../util/primitives.js';
5
- function parseFixedLengthBytes(value, byteLength, field) {
6
- const out = decodeNodeContentBase64OrBytes(value, field);
7
- if (out.byteLength !== byteLength) {
8
- throw new Error(`${field} must be ${byteLength} bytes`);
9
- }
10
- return out;
11
- }
12
- function parseBigEndianUint(bytes, field) {
13
- switch (bytes.byteLength) {
14
- case 1:
15
- return bytes[0];
16
- case 2:
17
- return (bytes[0] << 8) | bytes[1];
18
- case 3:
19
- return ((bytes[0] << 16) | (bytes[1] << 8) | bytes[2]) >>> 0;
20
- case 4:
21
- return ((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]) >>> 0;
22
- default:
23
- throw new Error(`${field} has invalid byte length`);
24
- }
25
- }
7
+ const RETRY_STATE_RANK = {
8
+ pending: 0,
9
+ delivered: 1,
10
+ read: 2,
11
+ played: 3,
12
+ ineligible: 4
13
+ };
26
14
  function requireNode(node, message) {
27
15
  if (!node) {
28
16
  throw new Error(message);
29
17
  }
30
18
  return node;
31
19
  }
20
+ function validateRetryReceiptToAttr(to, expectedToJids) {
21
+ if (!to || !expectedToJids || expectedToJids.length === 0) {
22
+ return;
23
+ }
24
+ let normalizedTo;
25
+ try {
26
+ normalizedTo = normalizeDeviceJid(to);
27
+ }
28
+ catch {
29
+ throw new Error('retry receipt has invalid to attr');
30
+ }
31
+ for (let index = 0; index < expectedToJids.length; index += 1) {
32
+ const expected = expectedToJids[index]?.trim();
33
+ if (!expected)
34
+ continue;
35
+ try {
36
+ if (normalizeDeviceJid(expected) === normalizedTo) {
37
+ return;
38
+ }
39
+ }
40
+ catch {
41
+ continue;
42
+ }
43
+ }
44
+ throw new Error('retry receipt to attr does not match local device');
45
+ }
32
46
  function parseRetryKeyBundle(node) {
33
47
  if (!node) {
34
48
  return undefined;
@@ -52,24 +66,24 @@ function parseRetryKeyBundle(node) {
52
66
  ? requireNode(keyValueNode, 'retry keys section has incomplete key')
53
67
  : null;
54
68
  return {
55
- identity: parseFixedLengthBytes(identity.content, SIGNAL_KEY_DATA_LENGTH, 'retry.keys.identity'),
69
+ identity: decodeExactLength(identity.content, 'retry.keys.identity', SIGNAL_KEY_DATA_LENGTH),
56
70
  deviceIdentity: deviceIdentityNode
57
71
  ? decodeNodeContentBase64OrBytes(deviceIdentityNode.content, 'retry.keys.device-identity')
58
72
  : undefined,
59
73
  key: keyId && keyValue
60
74
  ? {
61
- id: parseBigEndianUint(parseFixedLengthBytes(keyId.content, SIGNAL_KEY_ID_LENGTH, 'retry.keys.key.id'), 'retry.keys.key.id'),
62
- publicKey: parseFixedLengthBytes(keyValue.content, SIGNAL_KEY_DATA_LENGTH, 'retry.keys.key.value')
75
+ id: parseUint(decodeExactLength(keyId.content, 'retry.keys.key.id', SIGNAL_KEY_ID_LENGTH), 'retry.keys.key.id'),
76
+ publicKey: decodeExactLength(keyValue.content, 'retry.keys.key.value', SIGNAL_KEY_DATA_LENGTH)
63
77
  }
64
78
  : undefined,
65
79
  skey: {
66
- id: parseBigEndianUint(parseFixedLengthBytes(signedKeyId.content, SIGNAL_KEY_ID_LENGTH, 'retry.keys.skey.id'), 'retry.keys.skey.id'),
67
- publicKey: parseFixedLengthBytes(signedKeyValue.content, SIGNAL_KEY_DATA_LENGTH, 'retry.keys.skey.value'),
68
- signature: parseFixedLengthBytes(signedKeySignature.content, SIGNAL_SIGNATURE_LENGTH, 'retry.keys.skey.signature')
80
+ id: parseUint(decodeExactLength(signedKeyId.content, 'retry.keys.skey.id', SIGNAL_KEY_ID_LENGTH), 'retry.keys.skey.id'),
81
+ publicKey: decodeExactLength(signedKeyValue.content, 'retry.keys.skey.value', SIGNAL_KEY_DATA_LENGTH),
82
+ signature: decodeExactLength(signedKeySignature.content, 'retry.keys.skey.signature', SIGNAL_SIGNATURE_LENGTH)
69
83
  }
70
84
  };
71
85
  }
72
- export function parseRetryReceiptRequest(node) {
86
+ export function parseRetryReceiptRequest(node, options) {
73
87
  if (node.tag !== WA_MESSAGE_TAGS.RECEIPT) {
74
88
  return null;
75
89
  }
@@ -84,6 +98,7 @@ export function parseRetryReceiptRequest(node) {
84
98
  if (!stanzaId || !from) {
85
99
  throw new Error('retry receipt is missing id/from attrs');
86
100
  }
101
+ validateRetryReceiptToAttr(node.attrs.to, options?.expectedToJids);
87
102
  const [retryNode, registrationNode, keysNode] = findNodeChildrenByTags(node, [
88
103
  'retry',
89
104
  WA_NODE_TAGS.REGISTRATION,
@@ -95,18 +110,23 @@ export function parseRetryReceiptRequest(node) {
95
110
  if (!originalMsgId) {
96
111
  throw new Error('retry receipt is missing retry.id');
97
112
  }
98
- const registration = parseFixedLengthBytes(registrationNodeValue.content, SIGNAL_REGISTRATION_ID_LENGTH, 'retry.registration');
113
+ const registration = decodeExactLength(registrationNodeValue.content, 'retry.registration', SIGNAL_REGISTRATION_ID_LENGTH);
99
114
  return {
100
115
  type: receiptType,
101
116
  stanzaId,
102
117
  from,
103
118
  participant: node.attrs.participant,
104
119
  recipient: node.attrs.recipient,
120
+ offline: node.attrs.offline !== undefined,
121
+ isLid: node.attrs.is_lid === 'true',
105
122
  originalMsgId,
106
123
  retryCount: parseOptionalInt(retry.attrs.count) ?? 0,
107
124
  retryReason: parseOptionalInt(retry.attrs.error ?? node.attrs.error),
108
125
  t: retry.attrs.t ?? node.attrs.t,
109
- regId: parseBigEndianUint(registration, 'retry.registration'),
126
+ regId: parseUint(registration, 'retry.registration'),
110
127
  keyBundle: parseRetryKeyBundle(keysNode)
111
128
  };
112
129
  }
130
+ export function pickRetryStateMax(left, right) {
131
+ return RETRY_STATE_RANK[left] >= RETRY_STATE_RANK[right] ? left : right;
132
+ }
@@ -46,5 +46,5 @@ export function mapRetryReasonFromError(error) {
46
46
  return matcher.code;
47
47
  }
48
48
  }
49
- return RETRY_REASON.UnknownError;
49
+ return undefined;
50
50
  }
@@ -1,8 +1,8 @@
1
1
  import { wrapDeviceSentMessage } from '../message/device-sent.js';
2
2
  import { unpadPkcs7, writeRandomPadMax16 } from '../message/padding.js';
3
3
  import { proto } from '../proto.js';
4
- import { isGroupOrBroadcastJid, normalizeDeviceJid, parseSignalAddressFromJid, toUserJid } from '../protocol/jid.js';
5
- import { decodeRetryReplayPayload } from './outbound.js';
4
+ import { isGroupOrBroadcastJid, normalizeDeviceJid, parseJidFull, toUserJid } from '../protocol/jid.js';
5
+ import { decodeRetryReplayPayload } from './codec.js';
6
6
  import { decodeBinaryNode } from '../transport/binary/index.js';
7
7
  import { buildGroupRetryMessageNode } from '../transport/node/builders/message.js';
8
8
  import { findNodeChild } from '../transport/node/helpers.js';
@@ -12,9 +12,12 @@ export class WaRetryReplayService {
12
12
  this.options = options;
13
13
  }
14
14
  async resendOutboundMessage(outbound, requesterJid, retryCount) {
15
- const payload = decodeRetryReplayPayload(outbound.replayPayload);
16
- const requesterAddress = parseSignalAddressFromJid(requesterJid);
17
- const normalizedRequesterJid = normalizeDeviceJid(requesterJid);
15
+ const payload = outbound.replayPayload instanceof Uint8Array
16
+ ? decodeRetryReplayPayload(outbound.replayPayload)
17
+ : outbound.replayPayload;
18
+ const requesterParsed = parseJidFull(requesterJid);
19
+ const requesterAddress = requesterParsed.address;
20
+ const normalizedRequesterJid = requesterParsed.normalizedJid;
18
21
  if (payload.mode === 'plaintext') {
19
22
  return this.resendPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount);
20
23
  }
@@ -25,7 +28,7 @@ export class WaRetryReplayService {
25
28
  }
26
29
  async resendPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount) {
27
30
  if (isGroupOrBroadcastJid(payload.to)) {
28
- return this.resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress);
31
+ return this.resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount);
29
32
  }
30
33
  let payloadUserJid;
31
34
  let requesterUserJid;
@@ -50,7 +53,7 @@ export class WaRetryReplayService {
50
53
  });
51
54
  return 'resent';
52
55
  }
53
- async resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress) {
56
+ async resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount) {
54
57
  const plaintext = (await this.maybeWrapGroupRetryPlaintextForSelfDevice(payload, requesterJid)) ??
55
58
  payload.plaintext;
56
59
  const encrypted = await this.options.signalProtocol.encryptMessage(requesterAddress, plaintext);
@@ -71,6 +74,7 @@ export class WaRetryReplayService {
71
74
  addressingMode: requesterAddress.server === 'lid' ? 'lid' : 'pn',
72
75
  encType: encrypted.type,
73
76
  ciphertext: encrypted.ciphertext,
77
+ retryCount,
74
78
  deviceIdentity
75
79
  });
76
80
  await this.options.messageClient.sendMessageNode(retryNode);