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
@@ -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
+ });
@@ -78,6 +78,8 @@ export const WA_XMLNS = Object.freeze({
78
78
  PRIVACY: 'privacy',
79
79
  BLOCKLIST: 'blocklist',
80
80
  USYNC: 'usync',
81
+ BUSINESS: 'w:biz',
82
+ STATUS: 'status',
81
83
  GROUPS: 'w:g2',
82
84
  NEWSLETTER: 'newsletter',
83
85
  XMPP_PING: 'urn:xmpp:ping',
@@ -1,5 +1,7 @@
1
1
  export const WA_NOTIFICATION_TYPES = Object.freeze({
2
- GROUP: 'w:gp2'
2
+ GROUP: 'w:gp2',
3
+ ENCRYPT: 'encrypt',
4
+ DEVICES: 'devices'
3
5
  });
4
6
  export const WA_GROUP_NOTIFICATION_TAGS = Object.freeze({
5
7
  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
+ }
@@ -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);