zapo-js 0.1.2 → 0.2.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 (468) hide show
  1. package/README.md +12 -4
  2. package/dist/appstate/WaAppStateCrypto.js +1 -1
  3. package/dist/appstate/WaAppStateSyncClient.js +138 -93
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +8 -6
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +36 -47
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  11. package/dist/auth/pairing/WaPairingFlow.js +13 -3
  12. package/dist/client/WaClient.js +225 -101
  13. package/dist/client/WaClientFactory.js +294 -44
  14. package/dist/client/connection/WaConnectionManager.js +19 -10
  15. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  16. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  17. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  18. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
  19. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  20. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  21. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  22. package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
  23. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  24. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  25. package/dist/client/dirty.js +40 -20
  26. package/dist/client/events/devices.js +72 -0
  27. package/dist/client/events/group.js +3 -11
  28. package/dist/client/events/identity.js +22 -0
  29. package/dist/client/events/privacy-token.js +39 -0
  30. package/dist/client/history-sync.js +50 -9
  31. package/dist/client/incoming.js +37 -7
  32. package/dist/client/mailbox.js +24 -23
  33. package/dist/client/messages.js +107 -31
  34. package/dist/client/messaging/fanout.js +21 -11
  35. package/dist/client/messaging/participants.js +6 -4
  36. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  37. package/dist/client/tokens/cs-token.js +50 -0
  38. package/dist/client/tokens/tc-token.js +25 -0
  39. package/dist/crypto/core/index.js +2 -2
  40. package/dist/crypto/core/keys.js +4 -4
  41. package/dist/crypto/core/nonce.js +2 -0
  42. package/dist/crypto/core/primitives.js +0 -8
  43. package/dist/crypto/core/random.js +22 -0
  44. package/dist/crypto/curves/X25519.js +25 -6
  45. package/dist/crypto/index.js +3 -0
  46. package/dist/crypto/math/constants.js +13 -36
  47. package/dist/crypto/math/edwards.js +171 -44
  48. package/dist/crypto/math/fe.js +706 -0
  49. package/dist/crypto/math/mod.js +10 -3
  50. package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
  51. package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
  52. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  53. package/dist/esm/appstate/index.js +2 -2
  54. package/dist/esm/appstate/utils.js +2 -5
  55. package/dist/esm/auth/WaAuthClient.js +36 -47
  56. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
  57. package/dist/esm/auth/index.js +0 -2
  58. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  59. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
  60. package/dist/esm/client/WaClient.js +225 -101
  61. package/dist/esm/client/WaClientFactory.js +295 -45
  62. package/dist/esm/client/connection/WaConnectionManager.js +19 -10
  63. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  64. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  65. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  66. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
  67. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  68. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  69. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  70. package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
  71. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  72. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  73. package/dist/esm/client/dirty.js +40 -20
  74. package/dist/esm/client/events/devices.js +68 -0
  75. package/dist/esm/client/events/group.js +3 -11
  76. package/dist/esm/client/events/identity.js +19 -0
  77. package/dist/esm/client/events/privacy-token.js +36 -0
  78. package/dist/esm/client/history-sync.js +50 -9
  79. package/dist/esm/client/incoming.js +38 -8
  80. package/dist/esm/client/mailbox.js +24 -23
  81. package/dist/esm/client/messages.js +108 -32
  82. package/dist/esm/client/messaging/fanout.js +22 -12
  83. package/dist/esm/client/messaging/participants.js +6 -4
  84. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  85. package/dist/esm/client/tokens/cs-token.js +46 -0
  86. package/dist/esm/client/tokens/tc-token.js +18 -0
  87. package/dist/esm/crypto/core/index.js +2 -2
  88. package/dist/esm/crypto/core/keys.js +1 -1
  89. package/dist/esm/crypto/core/nonce.js +2 -0
  90. package/dist/esm/crypto/core/primitives.js +0 -7
  91. package/dist/esm/crypto/core/random.js +22 -1
  92. package/dist/esm/crypto/curves/X25519.js +25 -6
  93. package/dist/esm/crypto/index.js +1 -0
  94. package/dist/esm/crypto/math/constants.js +12 -35
  95. package/dist/esm/crypto/math/edwards.js +174 -47
  96. package/dist/esm/crypto/math/fe.js +691 -0
  97. package/dist/esm/crypto/math/mod.js +10 -1
  98. package/dist/esm/index.js +1 -1
  99. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  100. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  101. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  102. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  103. package/dist/esm/infra/perf/StoreLock.js +77 -0
  104. package/dist/esm/media/WaMediaCrypto.js +95 -13
  105. package/dist/esm/media/WaMediaTransferClient.js +39 -47
  106. package/dist/esm/media/constants.js +2 -1
  107. package/dist/esm/message/WaMessageClient.js +26 -19
  108. package/dist/esm/message/content.js +195 -9
  109. package/dist/esm/message/icdc.js +76 -0
  110. package/dist/esm/message/incoming.js +24 -12
  111. package/dist/esm/message/phash.js +3 -1
  112. package/dist/esm/message/reporting-token.js +14 -27
  113. package/dist/esm/protocol/appstate.js +9 -40
  114. package/dist/esm/protocol/browser.js +10 -18
  115. package/dist/esm/protocol/constants.js +5 -3
  116. package/dist/esm/protocol/defaults.js +6 -0
  117. package/dist/esm/protocol/index.js +1 -2
  118. package/dist/esm/protocol/jid.js +105 -36
  119. package/dist/esm/protocol/message.js +61 -1
  120. package/dist/esm/protocol/nodes.js +2 -0
  121. package/dist/esm/protocol/notification.js +3 -1
  122. package/dist/esm/protocol/privacy-token.js +17 -0
  123. package/dist/esm/protocol/privacy.js +55 -0
  124. package/dist/esm/protocol/stream.js +26 -1
  125. package/dist/esm/retry/codec.js +216 -0
  126. package/dist/esm/retry/constants.js +1 -1
  127. package/dist/esm/retry/index.js +2 -2
  128. package/dist/esm/retry/parse.js +50 -30
  129. package/dist/esm/retry/replay.js +11 -7
  130. package/dist/esm/retry/tracker.js +50 -12
  131. package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
  132. package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
  133. package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
  134. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
  135. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  136. package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
  137. package/dist/esm/signal/api/result-map.js +10 -0
  138. package/dist/esm/signal/constants.js +0 -4
  139. package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
  140. package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
  141. package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
  142. package/dist/esm/signal/group/SenderKeyManager.js +125 -106
  143. package/dist/esm/signal/index.js +1 -0
  144. package/dist/esm/signal/registration/keygen.js +6 -2
  145. package/dist/esm/signal/registration/utils.js +1 -0
  146. package/dist/esm/signal/session/SignalProtocol.js +150 -74
  147. package/dist/esm/signal/session/resolver.js +137 -102
  148. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  149. package/dist/esm/store/createStore.js +101 -187
  150. package/dist/esm/store/index.js +1 -10
  151. package/dist/esm/store/locks/appstate.lock.js +26 -0
  152. package/dist/esm/store/locks/auth.lock.js +15 -0
  153. package/dist/esm/store/locks/contact.lock.js +20 -0
  154. package/dist/esm/store/locks/device-list.lock.js +20 -0
  155. package/dist/esm/store/locks/message.lock.js +21 -0
  156. package/dist/esm/store/locks/participants.lock.js +20 -0
  157. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  158. package/dist/esm/store/locks/retry.lock.js +29 -0
  159. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  160. package/dist/esm/store/locks/signal.lock.js +63 -0
  161. package/dist/esm/store/locks/thread.lock.js +21 -0
  162. package/dist/esm/store/noop.store.js +1 -1
  163. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  164. package/dist/esm/store/providers/memory/device-list.store.js +10 -5
  165. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  166. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  167. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  168. package/dist/esm/store/providers/memory/signal.store.js +36 -19
  169. package/dist/esm/transport/WaComms.js +3 -1
  170. package/dist/esm/transport/WaWebSocket.js +0 -6
  171. package/dist/esm/transport/binary/constants.js +0 -30
  172. package/dist/esm/transport/binary/decoder.js +4 -4
  173. package/dist/esm/transport/binary/encoder.js +8 -15
  174. package/dist/esm/transport/binary/index.js +0 -1
  175. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
  176. package/dist/esm/transport/node/builders/business.js +129 -0
  177. package/dist/esm/transport/node/builders/global.js +370 -0
  178. package/dist/esm/transport/node/builders/index.js +5 -2
  179. package/dist/esm/transport/node/builders/message.js +63 -239
  180. package/dist/esm/transport/node/builders/pairing.js +0 -24
  181. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  182. package/dist/esm/transport/node/builders/privacy.js +48 -0
  183. package/dist/esm/transport/node/builders/profile.js +70 -0
  184. package/dist/esm/transport/node/builders/retry.js +10 -22
  185. package/dist/esm/transport/node/builders/usync.js +6 -2
  186. package/dist/esm/transport/node/helpers.js +19 -1
  187. package/dist/esm/transport/node/usync.js +3 -33
  188. package/dist/esm/transport/node/xml.js +35 -14
  189. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  190. package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
  191. package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
  192. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  193. package/dist/esm/transport/stream/parse.js +8 -4
  194. package/dist/esm/util/bytes.js +22 -18
  195. package/dist/esm/util/index.js +5 -0
  196. package/dist/esm/util/primitives.js +3 -2
  197. package/dist/index.js +7 -1
  198. package/dist/infra/perf/BackgroundQueue.js +482 -0
  199. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  200. package/dist/infra/perf/PromiseDedup.js +24 -0
  201. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  202. package/dist/infra/perf/StoreLock.js +81 -0
  203. package/dist/media/WaMediaCrypto.js +94 -12
  204. package/dist/media/WaMediaTransferClient.js +39 -47
  205. package/dist/media/constants.js +2 -1
  206. package/dist/message/WaMessageClient.js +26 -19
  207. package/dist/message/content.js +198 -9
  208. package/dist/message/icdc.js +81 -0
  209. package/dist/message/incoming.js +24 -12
  210. package/dist/message/phash.js +3 -1
  211. package/dist/message/reporting-token.js +14 -28
  212. package/dist/protocol/appstate.js +10 -41
  213. package/dist/protocol/browser.js +10 -18
  214. package/dist/protocol/constants.js +21 -2
  215. package/dist/protocol/defaults.js +6 -0
  216. package/dist/protocol/index.js +8 -5
  217. package/dist/protocol/jid.js +111 -36
  218. package/dist/protocol/message.js +62 -2
  219. package/dist/protocol/nodes.js +2 -0
  220. package/dist/protocol/notification.js +3 -1
  221. package/dist/protocol/privacy-token.js +20 -0
  222. package/dist/protocol/privacy.js +58 -0
  223. package/dist/protocol/stream.js +27 -2
  224. package/dist/retry/codec.js +220 -0
  225. package/dist/retry/constants.js +1 -1
  226. package/dist/retry/index.js +5 -5
  227. package/dist/retry/parse.js +51 -30
  228. package/dist/retry/replay.js +10 -6
  229. package/dist/retry/tracker.js +50 -12
  230. package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
  231. package/dist/signal/api/SignalDigestSyncApi.js +13 -9
  232. package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
  233. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  234. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  235. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  236. package/dist/signal/api/result-map.js +13 -0
  237. package/dist/signal/constants.js +1 -5
  238. package/dist/signal/crypto/WaAdvSignature.js +11 -5
  239. package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
  240. package/dist/signal/group/SenderKeyCodec.js +4 -3
  241. package/dist/signal/group/SenderKeyManager.js +125 -106
  242. package/dist/signal/index.js +13 -1
  243. package/dist/signal/registration/keygen.js +6 -2
  244. package/dist/signal/registration/utils.js +1 -0
  245. package/dist/signal/session/SignalProtocol.js +150 -74
  246. package/dist/signal/session/resolver.js +135 -100
  247. package/dist/store/contracts/privacy-token.store.js +2 -0
  248. package/dist/store/createStore.js +101 -187
  249. package/dist/store/index.js +15 -33
  250. package/dist/store/locks/appstate.lock.js +29 -0
  251. package/dist/store/locks/auth.lock.js +18 -0
  252. package/dist/store/locks/contact.lock.js +23 -0
  253. package/dist/store/locks/device-list.lock.js +23 -0
  254. package/dist/store/locks/message.lock.js +24 -0
  255. package/dist/store/locks/participants.lock.js +23 -0
  256. package/dist/store/locks/privacy-token.lock.js +21 -0
  257. package/dist/store/locks/retry.lock.js +32 -0
  258. package/dist/store/locks/sender-key.lock.js +55 -0
  259. package/dist/store/locks/signal.lock.js +66 -0
  260. package/dist/store/locks/thread.lock.js +24 -0
  261. package/dist/store/noop.store.js +1 -1
  262. package/dist/store/providers/memory/appstate.store.js +22 -24
  263. package/dist/store/providers/memory/device-list.store.js +10 -5
  264. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  265. package/dist/store/providers/memory/retry.store.js +77 -2
  266. package/dist/store/providers/memory/sender-key.store.js +6 -1
  267. package/dist/store/providers/memory/signal.store.js +36 -19
  268. package/dist/transport/WaComms.js +3 -1
  269. package/dist/transport/WaWebSocket.js +0 -6
  270. package/dist/transport/binary/constants.js +1 -31
  271. package/dist/transport/binary/decoder.js +4 -4
  272. package/dist/transport/binary/encoder.js +8 -15
  273. package/dist/transport/binary/index.js +0 -4
  274. package/dist/transport/node/WaNodeOrchestrator.js +24 -18
  275. package/dist/transport/node/builders/business.js +137 -0
  276. package/dist/transport/node/builders/global.js +375 -0
  277. package/dist/transport/node/builders/index.js +18 -9
  278. package/dist/transport/node/builders/message.js +64 -245
  279. package/dist/transport/node/builders/pairing.js +0 -26
  280. package/dist/transport/node/builders/privacy-token.js +46 -0
  281. package/dist/transport/node/builders/privacy.js +55 -0
  282. package/dist/transport/node/builders/profile.js +78 -0
  283. package/dist/transport/node/builders/retry.js +9 -21
  284. package/dist/transport/node/builders/usync.js +6 -2
  285. package/dist/transport/node/helpers.js +20 -1
  286. package/dist/transport/node/usync.js +2 -32
  287. package/dist/transport/node/xml.js +35 -14
  288. package/dist/transport/noise/WaClientPayload.js +13 -13
  289. package/dist/transport/noise/WaNoiseCert.js +2 -2
  290. package/dist/transport/noise/WaNoiseSession.js +64 -23
  291. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  292. package/dist/transport/stream/parse.js +7 -3
  293. package/dist/types/appstate/encoding.d.ts +7 -0
  294. package/dist/types/appstate/index.d.ts +3 -3
  295. package/dist/types/appstate/utils.d.ts +0 -2
  296. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  297. package/dist/types/auth/index.d.ts +0 -2
  298. package/dist/types/auth/types.d.ts +1 -0
  299. package/dist/types/client/WaClient.d.ts +27 -12
  300. package/dist/types/client/WaClientFactory.d.ts +12 -4
  301. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  302. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  303. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
  304. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
  305. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  306. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  307. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  308. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
  309. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  310. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  311. package/dist/types/client/events/devices.d.ts +20 -0
  312. package/dist/types/client/events/identity.d.ts +9 -0
  313. package/dist/types/client/events/privacy-token.d.ts +7 -0
  314. package/dist/types/client/history-sync.d.ts +9 -6
  315. package/dist/types/client/incoming.d.ts +3 -1
  316. package/dist/types/client/index.d.ts +1 -1
  317. package/dist/types/client/mailbox.d.ts +3 -5
  318. package/dist/types/client/messages.d.ts +1 -2
  319. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  320. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  321. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  322. package/dist/types/client/types.d.ts +51 -3
  323. package/dist/types/crypto/core/index.d.ts +2 -2
  324. package/dist/types/crypto/core/nonce.d.ts +2 -0
  325. package/dist/types/crypto/core/primitives.d.ts +0 -1
  326. package/dist/types/crypto/core/random.d.ts +1 -0
  327. package/dist/types/crypto/index.d.ts +1 -0
  328. package/dist/types/crypto/math/constants.d.ts +4 -2
  329. package/dist/types/crypto/math/fe.d.ts +30 -0
  330. package/dist/types/crypto/math/mod.d.ts +0 -2
  331. package/dist/types/crypto/math/types.d.ts +11 -4
  332. package/dist/types/index.d.ts +5 -3
  333. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  334. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  335. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  336. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  337. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  338. package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
  339. package/dist/types/media/constants.d.ts +1 -1
  340. package/dist/types/media/index.d.ts +1 -1
  341. package/dist/types/media/types.d.ts +10 -2
  342. package/dist/types/message/content.d.ts +8 -0
  343. package/dist/types/message/icdc.d.ts +13 -0
  344. package/dist/types/message/reporting-token.d.ts +0 -1
  345. package/dist/types/message/types.d.ts +45 -6
  346. package/dist/types/protocol/appstate.d.ts +0 -11
  347. package/dist/types/protocol/constants.d.ts +7 -3
  348. package/dist/types/protocol/defaults.d.ts +6 -0
  349. package/dist/types/protocol/index.d.ts +1 -2
  350. package/dist/types/protocol/jid.d.ts +19 -2
  351. package/dist/types/protocol/message.d.ts +60 -0
  352. package/dist/types/protocol/nodes.d.ts +2 -0
  353. package/dist/types/protocol/notification.d.ts +2 -0
  354. package/dist/types/protocol/privacy-token.d.ts +17 -0
  355. package/dist/types/protocol/privacy.d.ts +75 -0
  356. package/dist/types/protocol/stream.d.ts +30 -0
  357. package/dist/types/retry/codec.d.ts +3 -0
  358. package/dist/types/retry/index.d.ts +3 -3
  359. package/dist/types/retry/parse.d.ts +5 -2
  360. package/dist/types/retry/tracker.d.ts +1 -0
  361. package/dist/types/retry/types.d.ts +6 -1
  362. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  363. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  364. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  365. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  366. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  367. package/dist/types/signal/api/result-map.d.ts +1 -0
  368. package/dist/types/signal/constants.d.ts +0 -3
  369. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  370. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  371. package/dist/types/signal/index.d.ts +2 -0
  372. package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
  373. package/dist/types/signal/session/resolver.d.ts +7 -2
  374. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  375. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  376. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  377. package/dist/types/store/contracts/signal.store.d.ts +7 -0
  378. package/dist/types/store/createStore.d.ts +1 -1
  379. package/dist/types/store/index.d.ts +5 -13
  380. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  381. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  382. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  383. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  384. package/dist/types/store/locks/message.lock.d.ts +3 -0
  385. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  386. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  387. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  388. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  389. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  390. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  391. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  392. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  393. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  394. package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
  395. package/dist/types/store/types.d.ts +49 -61
  396. package/dist/types/transport/WaWebSocket.d.ts +0 -1
  397. package/dist/types/transport/binary/constants.d.ts +0 -30
  398. package/dist/types/transport/binary/index.d.ts +0 -1
  399. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  400. package/dist/types/transport/node/builders/business.d.ts +29 -0
  401. package/dist/types/transport/node/builders/global.d.ts +102 -0
  402. package/dist/types/transport/node/builders/index.d.ts +5 -2
  403. package/dist/types/transport/node/builders/message.d.ts +8 -7
  404. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  405. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  406. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  407. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  408. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  409. package/dist/types/transport/node/helpers.d.ts +5 -0
  410. package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
  411. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  412. package/dist/types/util/bytes.d.ts +1 -1
  413. package/dist/types/util/index.d.ts +5 -0
  414. package/dist/types/util/primitives.d.ts +0 -1
  415. package/dist/util/bytes.js +22 -18
  416. package/dist/util/index.js +23 -0
  417. package/dist/util/primitives.js +2 -2
  418. package/package.json +29 -7
  419. package/proto/index.js +1 -1
  420. package/dist/crypto/core/constants.js +0 -4
  421. package/dist/esm/crypto/core/constants.js +0 -1
  422. package/dist/esm/retry/outbound.js +0 -82
  423. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  424. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  425. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  426. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  427. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  428. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  429. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  430. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  431. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  432. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  433. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  434. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  435. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  436. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  437. package/dist/retry/outbound.js +0 -87
  438. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  439. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  440. package/dist/store/providers/sqlite/auth.store.js +0 -180
  441. package/dist/store/providers/sqlite/connection.js +0 -281
  442. package/dist/store/providers/sqlite/contact.store.js +0 -78
  443. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  444. package/dist/store/providers/sqlite/message.store.js +0 -136
  445. package/dist/store/providers/sqlite/migrations.js +0 -350
  446. package/dist/store/providers/sqlite/participants.store.js +0 -81
  447. package/dist/store/providers/sqlite/retry.store.js +0 -145
  448. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  449. package/dist/store/providers/sqlite/signal.store.js +0 -439
  450. package/dist/store/providers/sqlite/table-names.js +0 -113
  451. package/dist/store/providers/sqlite/thread.store.js +0 -89
  452. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  453. package/dist/types/crypto/core/constants.d.ts +0 -1
  454. package/dist/types/retry/outbound.d.ts +0 -4
  455. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  456. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  457. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  458. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  459. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  460. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  461. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  462. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  463. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  464. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  465. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  466. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  467. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  468. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeRetryReplayPayload = encodeRetryReplayPayload;
4
+ exports.decodeRetryReplayPayload = decodeRetryReplayPayload;
5
+ const bytes_1 = require("../util/bytes");
6
+ const RETRY_PAYLOAD_CODEC_MAGIC = 0x5a;
7
+ const RETRY_PAYLOAD_CODEC_VERSION = 1;
8
+ const RETRY_PAYLOAD_MODE = Object.freeze({
9
+ plaintext: 1,
10
+ encrypted: 2,
11
+ opaque_node: 3
12
+ });
13
+ const RETRY_PAYLOAD_ENC_TYPE = Object.freeze({
14
+ msg: 1,
15
+ pkmsg: 2,
16
+ skmsg: 3
17
+ });
18
+ const RETRY_PAYLOAD_ENC_TYPE_REVERSE = Object.freeze({
19
+ 1: 'msg',
20
+ 2: 'pkmsg',
21
+ 3: 'skmsg'
22
+ });
23
+ function encodeRetryReplayPayload(payload) {
24
+ const chunks = [];
25
+ if (payload.mode === 'plaintext') {
26
+ const header = new Uint8Array(3);
27
+ header[0] = RETRY_PAYLOAD_CODEC_MAGIC;
28
+ header[1] = RETRY_PAYLOAD_CODEC_VERSION;
29
+ header[2] = RETRY_PAYLOAD_MODE.plaintext;
30
+ chunks.push(header);
31
+ pushStringField(chunks, payload.to, 'to');
32
+ pushStringField(chunks, payload.type, 'type');
33
+ pushBytesField(chunks, payload.plaintext, 'plaintext');
34
+ return (0, bytes_1.concatBytes)(chunks);
35
+ }
36
+ if (payload.mode === 'encrypted') {
37
+ const header = new Uint8Array(3);
38
+ header[0] = RETRY_PAYLOAD_CODEC_MAGIC;
39
+ header[1] = RETRY_PAYLOAD_CODEC_VERSION;
40
+ header[2] = RETRY_PAYLOAD_MODE.encrypted;
41
+ chunks.push(header);
42
+ pushStringField(chunks, payload.to, 'to');
43
+ pushStringField(chunks, payload.type, 'type');
44
+ const hasParticipant = payload.participant !== undefined;
45
+ const modeDetails = new Uint8Array(2);
46
+ modeDetails[0] = RETRY_PAYLOAD_ENC_TYPE[payload.encType];
47
+ modeDetails[1] = hasParticipant ? 1 : 0;
48
+ chunks.push(modeDetails);
49
+ if (hasParticipant) {
50
+ pushStringField(chunks, payload.participant, 'participant');
51
+ }
52
+ pushBytesField(chunks, payload.ciphertext, 'ciphertext');
53
+ return (0, bytes_1.concatBytes)(chunks);
54
+ }
55
+ const header = new Uint8Array(3);
56
+ header[0] = RETRY_PAYLOAD_CODEC_MAGIC;
57
+ header[1] = RETRY_PAYLOAD_CODEC_VERSION;
58
+ header[2] = RETRY_PAYLOAD_MODE.opaque_node;
59
+ chunks.push(header);
60
+ pushBytesField(chunks, payload.node, 'node');
61
+ return (0, bytes_1.concatBytes)(chunks);
62
+ }
63
+ function decodeRetryReplayPayload(raw) {
64
+ if (raw.byteLength < 3) {
65
+ throw new Error('invalid retry replay payload: unsupported codec version');
66
+ }
67
+ if (raw[0] !== RETRY_PAYLOAD_CODEC_MAGIC || raw[1] !== RETRY_PAYLOAD_CODEC_VERSION) {
68
+ throw new Error('invalid retry replay payload: unsupported codec version');
69
+ }
70
+ return decodeCompactRetryReplayPayload(raw);
71
+ }
72
+ function decodeEncryptedType(value) {
73
+ const result = RETRY_PAYLOAD_ENC_TYPE_REVERSE[value];
74
+ if (!result) {
75
+ throw new Error(`invalid retry encrypted encType code: ${value}`);
76
+ }
77
+ return result;
78
+ }
79
+ function pushUint16(chunks, value, field) {
80
+ if (!Number.isSafeInteger(value) || value < 0 || value > 0xffff) {
81
+ throw new Error(`invalid retry replay payload ${field} length`);
82
+ }
83
+ const out = new Uint8Array(2);
84
+ out[0] = value >>> 8;
85
+ out[1] = value & 0xff;
86
+ chunks.push(out);
87
+ }
88
+ function pushUint32(chunks, value, field) {
89
+ if (!Number.isSafeInteger(value) || value < 0 || value > 0xffffffff) {
90
+ throw new Error(`invalid retry replay payload ${field} length`);
91
+ }
92
+ const out = new Uint8Array(4);
93
+ out[0] = (value >>> 24) & 0xff;
94
+ out[1] = (value >>> 16) & 0xff;
95
+ out[2] = (value >>> 8) & 0xff;
96
+ out[3] = value & 0xff;
97
+ chunks.push(out);
98
+ }
99
+ function pushStringField(chunks, value, field) {
100
+ const encoded = bytes_1.TEXT_ENCODER.encode(value);
101
+ pushUint16(chunks, encoded.byteLength, field);
102
+ chunks.push(encoded);
103
+ }
104
+ function pushBytesField(chunks, value, field) {
105
+ pushUint32(chunks, value.byteLength, field);
106
+ chunks.push(value);
107
+ }
108
+ function readUint8(raw, offset, field) {
109
+ if (offset >= raw.byteLength) {
110
+ throw new Error(`invalid retry replay payload field: ${field}`);
111
+ }
112
+ return [raw[offset], offset + 1];
113
+ }
114
+ function readUint16(raw, offset, field) {
115
+ if (offset + 2 > raw.byteLength) {
116
+ throw new Error(`invalid retry replay payload field: ${field}`);
117
+ }
118
+ return [((raw[offset] << 8) | raw[offset + 1]) >>> 0, offset + 2];
119
+ }
120
+ function readUint32(raw, offset, field) {
121
+ if (offset + 4 > raw.byteLength) {
122
+ throw new Error(`invalid retry replay payload field: ${field}`);
123
+ }
124
+ return [
125
+ ((raw[offset] << 24) |
126
+ (raw[offset + 1] << 16) |
127
+ (raw[offset + 2] << 8) |
128
+ raw[offset + 3]) >>>
129
+ 0,
130
+ offset + 4
131
+ ];
132
+ }
133
+ function readString(raw, offset, field) {
134
+ const [byteLength, nextOffset] = readUint16(raw, offset, `${field}.length`);
135
+ const endOffset = nextOffset + byteLength;
136
+ if (endOffset > raw.byteLength) {
137
+ throw new Error(`invalid retry replay payload field: ${field}`);
138
+ }
139
+ return [bytes_1.TEXT_DECODER.decode(raw.subarray(nextOffset, endOffset)), endOffset];
140
+ }
141
+ function readBytes(raw, offset, field) {
142
+ const [byteLength, nextOffset] = readUint32(raw, offset, `${field}.length`);
143
+ const endOffset = nextOffset + byteLength;
144
+ if (endOffset > raw.byteLength) {
145
+ throw new Error(`invalid retry replay payload field: ${field}`);
146
+ }
147
+ return [raw.subarray(nextOffset, endOffset), endOffset];
148
+ }
149
+ function assertNoTrailingData(raw, offset) {
150
+ if (offset !== raw.byteLength) {
151
+ throw new Error('invalid retry replay payload: trailing data');
152
+ }
153
+ }
154
+ function decodeCompactRetryReplayPayload(raw) {
155
+ let offset = 0;
156
+ let magic = 0;
157
+ let version = 0;
158
+ let mode = 0;
159
+ [magic, offset] = readUint8(raw, offset, 'magic');
160
+ [version, offset] = readUint8(raw, offset, 'version');
161
+ [mode, offset] = readUint8(raw, offset, 'mode');
162
+ if (magic !== RETRY_PAYLOAD_CODEC_MAGIC || version !== RETRY_PAYLOAD_CODEC_VERSION) {
163
+ throw new Error('invalid retry replay payload: unsupported codec version');
164
+ }
165
+ if (mode === RETRY_PAYLOAD_MODE.plaintext) {
166
+ let to = '';
167
+ let type = '';
168
+ let plaintext = raw;
169
+ [to, offset] = readString(raw, offset, 'to');
170
+ [type, offset] = readString(raw, offset, 'type');
171
+ [plaintext, offset] = readBytes(raw, offset, 'plaintext');
172
+ assertNoTrailingData(raw, offset);
173
+ return {
174
+ mode: 'plaintext',
175
+ to,
176
+ type,
177
+ plaintext
178
+ };
179
+ }
180
+ if (mode === RETRY_PAYLOAD_MODE.encrypted) {
181
+ let to = '';
182
+ let type = '';
183
+ let encTypeCode = 0;
184
+ let hasParticipant = 0;
185
+ let participant;
186
+ let ciphertext = raw;
187
+ [to, offset] = readString(raw, offset, 'to');
188
+ [type, offset] = readString(raw, offset, 'type');
189
+ [encTypeCode, offset] = readUint8(raw, offset, 'encType');
190
+ [hasParticipant, offset] = readUint8(raw, offset, 'hasParticipant');
191
+ if (hasParticipant !== 0 && hasParticipant !== 1) {
192
+ throw new Error('invalid retry replay payload field: hasParticipant');
193
+ }
194
+ if (hasParticipant === 1) {
195
+ ;
196
+ [participant, offset] = readString(raw, offset, 'participant');
197
+ }
198
+ ;
199
+ [ciphertext, offset] = readBytes(raw, offset, 'ciphertext');
200
+ assertNoTrailingData(raw, offset);
201
+ return {
202
+ mode: 'encrypted',
203
+ to,
204
+ type,
205
+ encType: decodeEncryptedType(encTypeCode),
206
+ participant,
207
+ ciphertext
208
+ };
209
+ }
210
+ if (mode === RETRY_PAYLOAD_MODE.opaque_node) {
211
+ let node = raw;
212
+ [node, offset] = readBytes(raw, offset, 'node');
213
+ assertNoTrailingData(raw, offset);
214
+ return {
215
+ mode: 'opaque_node',
216
+ node
217
+ };
218
+ }
219
+ throw new Error(`invalid retry replay payload mode: ${mode}`);
220
+ }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RETRY_REASON = exports.RETRY_RECEIPT_VERSION = exports.RETRY_OUTBOUND_TTL_MS = exports.RETRY_KEYS_MIN_COUNT = exports.MAX_RETRY_ATTEMPTS = void 0;
4
4
  exports.MAX_RETRY_ATTEMPTS = 5;
5
5
  exports.RETRY_KEYS_MIN_COUNT = 2;
6
- exports.RETRY_OUTBOUND_TTL_MS = 7 * 24 * 60 * 60 * 1000;
6
+ exports.RETRY_OUTBOUND_TTL_MS = 60 * 1000;
7
7
  exports.RETRY_RECEIPT_VERSION = '1';
8
8
  exports.RETRY_REASON = Object.freeze({
9
9
  UnknownError: 0,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createOutboundRetryTracker = exports.WaRetryReplayService = exports.pickRetryStateMax = exports.encodeRetryReplayPayload = exports.decodeRetryReplayPayload = exports.parseRetryReceiptRequest = exports.mapRetryReasonFromError = exports.RETRY_RECEIPT_VERSION = exports.RETRY_REASON = exports.RETRY_OUTBOUND_TTL_MS = exports.RETRY_KEYS_MIN_COUNT = exports.MAX_RETRY_ATTEMPTS = void 0;
3
+ exports.createOutboundRetryTracker = exports.WaRetryReplayService = exports.encodeRetryReplayPayload = exports.decodeRetryReplayPayload = exports.pickRetryStateMax = exports.parseRetryReceiptRequest = exports.mapRetryReasonFromError = exports.RETRY_RECEIPT_VERSION = exports.RETRY_REASON = exports.RETRY_OUTBOUND_TTL_MS = exports.RETRY_KEYS_MIN_COUNT = exports.MAX_RETRY_ATTEMPTS = void 0;
4
4
  var constants_1 = require("./constants");
5
5
  Object.defineProperty(exports, "MAX_RETRY_ATTEMPTS", { enumerable: true, get: function () { return constants_1.MAX_RETRY_ATTEMPTS; } });
6
6
  Object.defineProperty(exports, "RETRY_KEYS_MIN_COUNT", { enumerable: true, get: function () { return constants_1.RETRY_KEYS_MIN_COUNT; } });
@@ -11,10 +11,10 @@ var reason_1 = require("./reason");
11
11
  Object.defineProperty(exports, "mapRetryReasonFromError", { enumerable: true, get: function () { return reason_1.mapRetryReasonFromError; } });
12
12
  var parse_1 = require("./parse");
13
13
  Object.defineProperty(exports, "parseRetryReceiptRequest", { enumerable: true, get: function () { return parse_1.parseRetryReceiptRequest; } });
14
- var outbound_1 = require("./outbound");
15
- Object.defineProperty(exports, "decodeRetryReplayPayload", { enumerable: true, get: function () { return outbound_1.decodeRetryReplayPayload; } });
16
- Object.defineProperty(exports, "encodeRetryReplayPayload", { enumerable: true, get: function () { return outbound_1.encodeRetryReplayPayload; } });
17
- Object.defineProperty(exports, "pickRetryStateMax", { enumerable: true, get: function () { return outbound_1.pickRetryStateMax; } });
14
+ Object.defineProperty(exports, "pickRetryStateMax", { enumerable: true, get: function () { return parse_1.pickRetryStateMax; } });
15
+ var codec_1 = require("./codec");
16
+ Object.defineProperty(exports, "decodeRetryReplayPayload", { enumerable: true, get: function () { return codec_1.decodeRetryReplayPayload; } });
17
+ Object.defineProperty(exports, "encodeRetryReplayPayload", { enumerable: true, get: function () { return codec_1.encodeRetryReplayPayload; } });
18
18
  var replay_1 = require("./replay");
19
19
  Object.defineProperty(exports, "WaRetryReplayService", { enumerable: true, get: function () { return replay_1.WaRetryReplayService; } });
20
20
  var tracker_1 = require("./tracker");
@@ -1,37 +1,52 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseRetryReceiptRequest = parseRetryReceiptRequest;
4
+ exports.pickRetryStateMax = pickRetryStateMax;
4
5
  const constants_1 = require("../protocol/constants");
6
+ const jid_1 = require("../protocol/jid");
7
+ const codec_1 = require("../signal/api/codec");
5
8
  const constants_2 = require("../signal/api/constants");
6
9
  const helpers_1 = require("../transport/node/helpers");
7
10
  const primitives_1 = require("../util/primitives");
8
- function parseFixedLengthBytes(value, byteLength, field) {
9
- const out = (0, helpers_1.decodeNodeContentBase64OrBytes)(value, field);
10
- if (out.byteLength !== byteLength) {
11
- throw new Error(`${field} must be ${byteLength} bytes`);
12
- }
13
- return out;
14
- }
15
- function parseBigEndianUint(bytes, field) {
16
- switch (bytes.byteLength) {
17
- case 1:
18
- return bytes[0];
19
- case 2:
20
- return (bytes[0] << 8) | bytes[1];
21
- case 3:
22
- return ((bytes[0] << 16) | (bytes[1] << 8) | bytes[2]) >>> 0;
23
- case 4:
24
- return ((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]) >>> 0;
25
- default:
26
- throw new Error(`${field} has invalid byte length`);
27
- }
28
- }
11
+ const RETRY_STATE_RANK = {
12
+ pending: 0,
13
+ delivered: 1,
14
+ read: 2,
15
+ played: 3,
16
+ ineligible: 4
17
+ };
29
18
  function requireNode(node, message) {
30
19
  if (!node) {
31
20
  throw new Error(message);
32
21
  }
33
22
  return node;
34
23
  }
24
+ function validateRetryReceiptToAttr(to, expectedToJids) {
25
+ if (!to || !expectedToJids || expectedToJids.length === 0) {
26
+ return;
27
+ }
28
+ let normalizedTo;
29
+ try {
30
+ normalizedTo = (0, jid_1.normalizeDeviceJid)(to);
31
+ }
32
+ catch {
33
+ throw new Error('retry receipt has invalid to attr');
34
+ }
35
+ for (let index = 0; index < expectedToJids.length; index += 1) {
36
+ const expected = expectedToJids[index]?.trim();
37
+ if (!expected)
38
+ continue;
39
+ try {
40
+ if ((0, jid_1.normalizeDeviceJid)(expected) === normalizedTo) {
41
+ return;
42
+ }
43
+ }
44
+ catch {
45
+ continue;
46
+ }
47
+ }
48
+ throw new Error('retry receipt to attr does not match local device');
49
+ }
35
50
  function parseRetryKeyBundle(node) {
36
51
  if (!node) {
37
52
  return undefined;
@@ -55,24 +70,24 @@ function parseRetryKeyBundle(node) {
55
70
  ? requireNode(keyValueNode, 'retry keys section has incomplete key')
56
71
  : null;
57
72
  return {
58
- identity: parseFixedLengthBytes(identity.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.identity'),
73
+ identity: (0, codec_1.decodeExactLength)(identity.content, 'retry.keys.identity', constants_2.SIGNAL_KEY_DATA_LENGTH),
59
74
  deviceIdentity: deviceIdentityNode
60
75
  ? (0, helpers_1.decodeNodeContentBase64OrBytes)(deviceIdentityNode.content, 'retry.keys.device-identity')
61
76
  : undefined,
62
77
  key: keyId && keyValue
63
78
  ? {
64
- id: parseBigEndianUint(parseFixedLengthBytes(keyId.content, constants_2.SIGNAL_KEY_ID_LENGTH, 'retry.keys.key.id'), 'retry.keys.key.id'),
65
- publicKey: parseFixedLengthBytes(keyValue.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.key.value')
79
+ id: (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(keyId.content, 'retry.keys.key.id', constants_2.SIGNAL_KEY_ID_LENGTH), 'retry.keys.key.id'),
80
+ publicKey: (0, codec_1.decodeExactLength)(keyValue.content, 'retry.keys.key.value', constants_2.SIGNAL_KEY_DATA_LENGTH)
66
81
  }
67
82
  : undefined,
68
83
  skey: {
69
- id: parseBigEndianUint(parseFixedLengthBytes(signedKeyId.content, constants_2.SIGNAL_KEY_ID_LENGTH, 'retry.keys.skey.id'), 'retry.keys.skey.id'),
70
- publicKey: parseFixedLengthBytes(signedKeyValue.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.skey.value'),
71
- signature: parseFixedLengthBytes(signedKeySignature.content, constants_2.SIGNAL_SIGNATURE_LENGTH, 'retry.keys.skey.signature')
84
+ id: (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(signedKeyId.content, 'retry.keys.skey.id', constants_2.SIGNAL_KEY_ID_LENGTH), 'retry.keys.skey.id'),
85
+ publicKey: (0, codec_1.decodeExactLength)(signedKeyValue.content, 'retry.keys.skey.value', constants_2.SIGNAL_KEY_DATA_LENGTH),
86
+ signature: (0, codec_1.decodeExactLength)(signedKeySignature.content, 'retry.keys.skey.signature', constants_2.SIGNAL_SIGNATURE_LENGTH)
72
87
  }
73
88
  };
74
89
  }
75
- function parseRetryReceiptRequest(node) {
90
+ function parseRetryReceiptRequest(node, options) {
76
91
  if (node.tag !== constants_1.WA_MESSAGE_TAGS.RECEIPT) {
77
92
  return null;
78
93
  }
@@ -87,6 +102,7 @@ function parseRetryReceiptRequest(node) {
87
102
  if (!stanzaId || !from) {
88
103
  throw new Error('retry receipt is missing id/from attrs');
89
104
  }
105
+ validateRetryReceiptToAttr(node.attrs.to, options?.expectedToJids);
90
106
  const [retryNode, registrationNode, keysNode] = (0, helpers_1.findNodeChildrenByTags)(node, [
91
107
  'retry',
92
108
  constants_1.WA_NODE_TAGS.REGISTRATION,
@@ -98,18 +114,23 @@ function parseRetryReceiptRequest(node) {
98
114
  if (!originalMsgId) {
99
115
  throw new Error('retry receipt is missing retry.id');
100
116
  }
101
- const registration = parseFixedLengthBytes(registrationNodeValue.content, constants_2.SIGNAL_REGISTRATION_ID_LENGTH, 'retry.registration');
117
+ const registration = (0, codec_1.decodeExactLength)(registrationNodeValue.content, 'retry.registration', constants_2.SIGNAL_REGISTRATION_ID_LENGTH);
102
118
  return {
103
119
  type: receiptType,
104
120
  stanzaId,
105
121
  from,
106
122
  participant: node.attrs.participant,
107
123
  recipient: node.attrs.recipient,
124
+ offline: node.attrs.offline !== undefined,
125
+ isLid: node.attrs.is_lid === 'true',
108
126
  originalMsgId,
109
127
  retryCount: (0, primitives_1.parseOptionalInt)(retry.attrs.count) ?? 0,
110
128
  retryReason: (0, primitives_1.parseOptionalInt)(retry.attrs.error ?? node.attrs.error),
111
129
  t: retry.attrs.t ?? node.attrs.t,
112
- regId: parseBigEndianUint(registration, 'retry.registration'),
130
+ regId: (0, codec_1.parseUint)(registration, 'retry.registration'),
113
131
  keyBundle: parseRetryKeyBundle(keysNode)
114
132
  };
115
133
  }
134
+ function pickRetryStateMax(left, right) {
135
+ return RETRY_STATE_RANK[left] >= RETRY_STATE_RANK[right] ? left : right;
136
+ }
@@ -5,7 +5,7 @@ const device_sent_1 = require("../message/device-sent");
5
5
  const padding_1 = require("../message/padding");
6
6
  const _proto_1 = require("../proto.js");
7
7
  const jid_1 = require("../protocol/jid");
8
- const outbound_1 = require("./outbound");
8
+ const codec_1 = require("./codec");
9
9
  const binary_1 = require("../transport/binary");
10
10
  const message_1 = require("../transport/node/builders/message");
11
11
  const helpers_1 = require("../transport/node/helpers");
@@ -15,9 +15,12 @@ class WaRetryReplayService {
15
15
  this.options = options;
16
16
  }
17
17
  async resendOutboundMessage(outbound, requesterJid, retryCount) {
18
- const payload = (0, outbound_1.decodeRetryReplayPayload)(outbound.replayPayload);
19
- const requesterAddress = (0, jid_1.parseSignalAddressFromJid)(requesterJid);
20
- const normalizedRequesterJid = (0, jid_1.normalizeDeviceJid)(requesterJid);
18
+ const payload = outbound.replayPayload instanceof Uint8Array
19
+ ? (0, codec_1.decodeRetryReplayPayload)(outbound.replayPayload)
20
+ : outbound.replayPayload;
21
+ const requesterParsed = (0, jid_1.parseJidFull)(requesterJid);
22
+ const requesterAddress = requesterParsed.address;
23
+ const normalizedRequesterJid = requesterParsed.normalizedJid;
21
24
  if (payload.mode === 'plaintext') {
22
25
  return this.resendPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount);
23
26
  }
@@ -28,7 +31,7 @@ class WaRetryReplayService {
28
31
  }
29
32
  async resendPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount) {
30
33
  if ((0, jid_1.isGroupOrBroadcastJid)(payload.to)) {
31
- return this.resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress);
34
+ return this.resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount);
32
35
  }
33
36
  let payloadUserJid;
34
37
  let requesterUserJid;
@@ -53,7 +56,7 @@ class WaRetryReplayService {
53
56
  });
54
57
  return 'resent';
55
58
  }
56
- async resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress) {
59
+ async resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount) {
57
60
  const plaintext = (await this.maybeWrapGroupRetryPlaintextForSelfDevice(payload, requesterJid)) ??
58
61
  payload.plaintext;
59
62
  const encrypted = await this.options.signalProtocol.encryptMessage(requesterAddress, plaintext);
@@ -74,6 +77,7 @@ class WaRetryReplayService {
74
77
  addressingMode: requesterAddress.server === 'lid' ? 'lid' : 'pn',
75
78
  encType: encrypted.type,
76
79
  ciphertext: encrypted.ciphertext,
80
+ retryCount,
77
81
  deviceIdentity
78
82
  });
79
83
  await this.options.messageClient.sendMessageNode(retryNode);
@@ -1,12 +1,36 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createOutboundRetryTracker = createOutboundRetryTracker;
4
+ const jid_1 = require("../protocol/jid");
5
+ const codec_1 = require("./codec");
4
6
  const constants_1 = require("./constants");
5
- const outbound_1 = require("./outbound");
6
7
  const primitives_1 = require("../util/primitives");
7
8
  function createOutboundRetryTracker(options) {
8
9
  const { retryStore, logger } = options;
9
10
  const retryTtlMs = retryStore.getTtlMs?.() ?? constants_1.RETRY_OUTBOUND_TTL_MS;
11
+ const supportsRawReplayPayload = retryStore.supportsRawReplayPayload?.() ?? false;
12
+ const normalizeEligibleRequesterDeviceJids = (values) => {
13
+ if (!values || values.length === 0) {
14
+ return undefined;
15
+ }
16
+ const deduped = new Set();
17
+ for (let index = 0; index < values.length; index += 1) {
18
+ const raw = values[index]?.trim();
19
+ if (!raw) {
20
+ continue;
21
+ }
22
+ try {
23
+ deduped.add((0, jid_1.normalizeDeviceJid)(raw));
24
+ }
25
+ catch {
26
+ continue;
27
+ }
28
+ }
29
+ if (deduped.size === 0) {
30
+ return undefined;
31
+ }
32
+ return Array.from(deduped);
33
+ };
10
34
  const safeUpsertRetryOutboundRecord = async (record) => {
11
35
  try {
12
36
  await retryStore.upsertOutboundMessage(record);
@@ -25,34 +49,48 @@ function createOutboundRetryTracker(options) {
25
49
  return {
26
50
  track: async (hint, publish) => {
27
51
  const nowMs = Date.now();
28
- const expiresAtMs = nowMs + retryTtlMs;
29
- const hintedMessageId = hint.messageIdHint?.trim();
30
52
  const replayMode = hint.replayPayload.mode;
31
53
  const resolvedToJid = hint.toJid ?? (replayMode === 'opaque_node' ? '' : hint.replayPayload.to);
32
- const replayPayload = (0, outbound_1.encodeRetryReplayPayload)(hint.replayPayload);
33
- let hintedPersisted = false;
34
- const createRetryOutboundRecord = (messageId, createdAtMs, updatedAtMs, expiresAtMs) => ({
54
+ const replayPayload = supportsRawReplayPayload
55
+ ? hint.replayPayload
56
+ : (0, codec_1.encodeRetryReplayPayload)(hint.replayPayload);
57
+ let eligibleRequesterDeviceJids = normalizeEligibleRequesterDeviceJids(hint.eligibleRequesterDeviceJids);
58
+ if (!eligibleRequesterDeviceJids &&
59
+ resolvedToJid &&
60
+ !(0, jid_1.isGroupOrBroadcastJid)(resolvedToJid)) {
61
+ try {
62
+ eligibleRequesterDeviceJids = [(0, jid_1.normalizeDeviceJid)(resolvedToJid)];
63
+ }
64
+ catch {
65
+ eligibleRequesterDeviceJids = undefined;
66
+ }
67
+ }
68
+ const createRetryOutboundRecord = (messageId, updatedAtMs, expiresAtMs) => ({
35
69
  messageId,
36
70
  toJid: resolvedToJid,
37
71
  participantJid: hint.participantJid,
38
72
  recipientJid: hint.recipientJid,
73
+ eligibleRequesterDeviceJids,
74
+ deliveredRequesterDeviceJids: [],
39
75
  messageType: hint.type,
40
76
  replayMode,
41
77
  replayPayload,
42
78
  state: 'pending',
43
- createdAtMs,
79
+ createdAtMs: nowMs,
44
80
  updatedAtMs,
45
81
  expiresAtMs
46
82
  });
47
- if (hintedMessageId) {
48
- hintedPersisted = await safeUpsertRetryOutboundRecord(createRetryOutboundRecord(hintedMessageId, nowMs, nowMs, expiresAtMs));
49
- }
50
83
  const result = await publish();
51
- if (hintedPersisted && hintedMessageId && result.id === hintedMessageId) {
84
+ const persistedMessageId = result.id.trim();
85
+ if (!persistedMessageId) {
86
+ logger.warn('retry outbound record skipped: publish returned empty message id', {
87
+ to: resolvedToJid,
88
+ mode: replayMode
89
+ });
52
90
  return result;
53
91
  }
54
92
  const persistedNowMs = Date.now();
55
- await safeUpsertRetryOutboundRecord(createRetryOutboundRecord(result.id, hintedMessageId ? nowMs : persistedNowMs, persistedNowMs, persistedNowMs + retryTtlMs));
93
+ await safeUpsertRetryOutboundRecord(createRetryOutboundRecord(persistedMessageId, persistedNowMs, persistedNowMs + retryTtlMs));
56
94
  return result;
57
95
  }
58
96
  };