zapo-js 0.1.1 → 0.1.2

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 (363) hide show
  1. package/README.md +8 -0
  2. package/dist/appstate/WaAppStateCrypto.js +18 -25
  3. package/dist/appstate/WaAppStateSyncClient.js +181 -114
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/utils.js +10 -30
  7. package/dist/auth/WaAuthClient.js +48 -55
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
  9. package/dist/auth/index.js +1 -3
  10. package/dist/auth/pairing/WaPairingFlow.js +21 -23
  11. package/dist/auth/pairing/WaQrFlow.js +37 -24
  12. package/dist/client/WaClient.js +103 -276
  13. package/dist/client/WaClientFactory.js +227 -110
  14. package/dist/client/connection/WaConnectionManager.js +292 -0
  15. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  16. package/dist/client/connection/WaReceiptQueue.js +51 -0
  17. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
  21. package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
  22. package/dist/client/dirty.js +35 -29
  23. package/dist/client/events/chat.js +4 -3
  24. package/dist/client/events/group.js +59 -36
  25. package/dist/client/history-sync.js +53 -63
  26. package/dist/client/incoming.js +23 -20
  27. package/dist/client/mailbox.js +8 -8
  28. package/dist/client/messages.js +4 -4
  29. package/dist/client/messaging/fanout.js +189 -0
  30. package/dist/client/messaging/key-protocol.js +130 -0
  31. package/dist/client/messaging/participants.js +191 -0
  32. package/dist/crypto/core/hkdf.js +3 -8
  33. package/dist/crypto/core/index.js +1 -4
  34. package/dist/crypto/core/keys.js +2 -3
  35. package/dist/crypto/core/primitives.js +12 -15
  36. package/dist/crypto/core/random.js +7 -26
  37. package/dist/crypto/curves/Ed25519.js +7 -8
  38. package/dist/crypto/curves/X25519.js +13 -16
  39. package/dist/crypto/index.js +0 -5
  40. package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
  41. package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
  42. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  43. package/dist/esm/appstate/constants.js +3 -2
  44. package/dist/esm/appstate/utils.js +8 -27
  45. package/dist/esm/auth/WaAuthClient.js +48 -55
  46. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
  47. package/dist/esm/auth/index.js +0 -1
  48. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
  49. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  50. package/dist/esm/client/WaClient.js +103 -276
  51. package/dist/esm/client/WaClientFactory.js +227 -110
  52. package/dist/esm/client/connection/WaConnectionManager.js +288 -0
  53. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  54. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  55. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  56. package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
  57. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  58. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
  59. package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
  60. package/dist/esm/client/dirty.js +30 -24
  61. package/dist/esm/client/events/chat.js +4 -3
  62. package/dist/esm/client/events/group.js +50 -28
  63. package/dist/esm/client/history-sync.js +50 -60
  64. package/dist/esm/client/incoming.js +23 -20
  65. package/dist/esm/client/mailbox.js +8 -8
  66. package/dist/esm/client/messages.js +1 -1
  67. package/dist/esm/client/messaging/fanout.js +186 -0
  68. package/dist/esm/client/messaging/key-protocol.js +127 -0
  69. package/dist/esm/client/messaging/participants.js +188 -0
  70. package/dist/esm/crypto/core/hkdf.js +3 -8
  71. package/dist/esm/crypto/core/index.js +0 -1
  72. package/dist/esm/crypto/core/keys.js +2 -3
  73. package/dist/esm/crypto/core/primitives.js +12 -15
  74. package/dist/esm/crypto/core/random.js +6 -25
  75. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  76. package/dist/esm/crypto/curves/X25519.js +10 -13
  77. package/dist/esm/crypto/index.js +0 -2
  78. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  79. package/dist/esm/infra/log/PinoLogger.js +15 -9
  80. package/dist/esm/infra/log/types.js +11 -1
  81. package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
  82. package/dist/esm/media/WaMediaCrypto.js +2 -4
  83. package/dist/esm/media/WaMediaTransferClient.js +226 -58
  84. package/dist/esm/media/conn.js +10 -6
  85. package/dist/esm/media/constants.js +4 -1
  86. package/dist/esm/message/WaMessageClient.js +4 -13
  87. package/dist/esm/message/ack.js +6 -6
  88. package/dist/esm/message/addon-crypto.js +59 -0
  89. package/dist/esm/message/incoming.js +106 -111
  90. package/dist/esm/message/index.js +2 -0
  91. package/dist/esm/message/reporting-token.js +438 -0
  92. package/dist/esm/message/use-case-secret.js +49 -0
  93. package/dist/esm/protocol/appstate.js +58 -0
  94. package/dist/esm/protocol/constants.js +2 -1
  95. package/dist/esm/protocol/index.js +2 -10
  96. package/dist/esm/protocol/jid.js +63 -51
  97. package/dist/esm/protocol/media.js +3 -3
  98. package/dist/esm/protocol/nodes.js +2 -0
  99. package/dist/esm/protocol/usync.js +11 -0
  100. package/dist/esm/retry/index.js +1 -0
  101. package/dist/esm/retry/outbound.js +4 -5
  102. package/dist/esm/retry/parse.js +58 -76
  103. package/dist/esm/retry/replay.js +48 -49
  104. package/dist/esm/retry/tracker.js +56 -0
  105. package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
  106. package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
  107. package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
  108. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
  109. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
  110. package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
  111. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  112. package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
  113. package/dist/esm/signal/group/SenderKeyManager.js +26 -16
  114. package/dist/esm/signal/index.js +1 -0
  115. package/dist/esm/signal/session/SignalProtocol.js +49 -14
  116. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  117. package/dist/esm/signal/session/SignalSession.js +14 -9
  118. package/dist/esm/signal/session/resolver.js +186 -0
  119. package/dist/esm/signal/store/sqlite.js +16 -37
  120. package/dist/esm/store/createStore.js +16 -18
  121. package/dist/esm/store/noop.store.js +3 -6
  122. package/dist/esm/store/providers/memory/appstate.store.js +30 -6
  123. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  124. package/dist/esm/store/providers/memory/device-list.store.js +3 -30
  125. package/dist/esm/store/providers/memory/message.store.js +11 -5
  126. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  127. package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
  128. package/dist/esm/store/providers/memory/signal.store.js +13 -1
  129. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  130. package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
  131. package/dist/esm/store/providers/sqlite/connection.js +18 -13
  132. package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
  133. package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
  134. package/dist/esm/store/providers/sqlite/message.store.js +45 -32
  135. package/dist/esm/store/providers/sqlite/migrations.js +1 -1
  136. package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
  137. package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
  138. package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
  139. package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
  140. package/dist/esm/store/providers/sqlite/table-names.js +107 -0
  141. package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
  142. package/dist/esm/transport/WaComms.js +25 -23
  143. package/dist/esm/transport/WaWebSocket.js +115 -12
  144. package/dist/esm/transport/binary/decoder.js +4 -4
  145. package/dist/esm/transport/binary/encoder.js +12 -4
  146. package/dist/esm/transport/index.js +1 -0
  147. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  148. package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
  149. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  150. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  151. package/dist/esm/transport/node/builders/index.js +2 -1
  152. package/dist/esm/transport/node/builders/message.js +9 -0
  153. package/dist/esm/transport/node/builders/pairing.js +4 -5
  154. package/dist/esm/transport/node/builders/usync.js +41 -0
  155. package/dist/esm/transport/node/helpers.js +107 -5
  156. package/dist/esm/transport/node/usync.js +35 -0
  157. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  158. package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
  159. package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
  160. package/dist/esm/transport/proxy.js +27 -0
  161. package/dist/esm/transport/stream/parse.js +13 -48
  162. package/dist/esm/util/bytes.js +50 -32
  163. package/dist/esm/util/coercion.js +6 -14
  164. package/dist/esm/util/primitives.js +39 -14
  165. package/dist/infra/log/ConsoleLogger.js +18 -17
  166. package/dist/infra/log/PinoLogger.js +15 -9
  167. package/dist/infra/log/types.js +12 -0
  168. package/dist/infra/perf/BoundedTaskQueue.js +13 -17
  169. package/dist/media/WaMediaCrypto.js +1 -3
  170. package/dist/media/WaMediaTransferClient.js +259 -58
  171. package/dist/media/conn.js +10 -6
  172. package/dist/media/constants.js +4 -1
  173. package/dist/message/WaMessageClient.js +5 -14
  174. package/dist/message/ack.js +6 -6
  175. package/dist/message/addon-crypto.js +65 -0
  176. package/dist/message/incoming.js +104 -109
  177. package/dist/message/index.js +2 -0
  178. package/dist/message/reporting-token.js +443 -0
  179. package/dist/message/use-case-secret.js +55 -0
  180. package/dist/protocol/appstate.js +59 -1
  181. package/dist/protocol/constants.js +7 -1
  182. package/dist/protocol/index.js +20 -42
  183. package/dist/protocol/jid.js +64 -51
  184. package/dist/protocol/media.js +3 -3
  185. package/dist/protocol/nodes.js +2 -0
  186. package/dist/protocol/usync.js +14 -0
  187. package/dist/retry/index.js +3 -1
  188. package/dist/retry/outbound.js +6 -7
  189. package/dist/retry/parse.js +57 -75
  190. package/dist/retry/replay.js +46 -47
  191. package/dist/retry/tracker.js +59 -0
  192. package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
  193. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  194. package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
  195. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
  196. package/dist/signal/api/SignalSessionSyncApi.js +23 -30
  197. package/dist/signal/crypto/WaAdvSignature.js +2 -4
  198. package/dist/signal/group/SenderKeyChain.js +27 -22
  199. package/dist/signal/group/SenderKeyCodec.js +1 -3
  200. package/dist/signal/group/SenderKeyManager.js +26 -16
  201. package/dist/signal/index.js +3 -1
  202. package/dist/signal/session/SignalProtocol.js +49 -14
  203. package/dist/signal/session/SignalRatchet.js +24 -15
  204. package/dist/signal/session/SignalSession.js +14 -9
  205. package/dist/signal/session/resolver.js +189 -0
  206. package/dist/signal/store/sqlite.js +16 -37
  207. package/dist/store/createStore.js +16 -18
  208. package/dist/store/noop.store.js +3 -6
  209. package/dist/store/providers/memory/appstate.store.js +28 -4
  210. package/dist/store/providers/memory/contact.store.js +5 -0
  211. package/dist/store/providers/memory/device-list.store.js +3 -30
  212. package/dist/store/providers/memory/message.store.js +11 -5
  213. package/dist/store/providers/memory/participants.store.js +1 -8
  214. package/dist/store/providers/memory/sender-key.store.js +8 -10
  215. package/dist/store/providers/memory/signal.store.js +21 -9
  216. package/dist/store/providers/memory/thread.store.js +5 -0
  217. package/dist/store/providers/sqlite/appstate.store.js +81 -0
  218. package/dist/store/providers/sqlite/connection.js +18 -13
  219. package/dist/store/providers/sqlite/contact.store.js +31 -18
  220. package/dist/store/providers/sqlite/device-list.store.js +7 -35
  221. package/dist/store/providers/sqlite/message.store.js +45 -32
  222. package/dist/store/providers/sqlite/migrations.js +1 -1
  223. package/dist/store/providers/sqlite/participants.store.js +1 -9
  224. package/dist/store/providers/sqlite/retry.store.js +8 -11
  225. package/dist/store/providers/sqlite/sender-key.store.js +24 -29
  226. package/dist/store/providers/sqlite/signal.store.js +105 -23
  227. package/dist/store/providers/sqlite/table-names.js +113 -0
  228. package/dist/store/providers/sqlite/thread.store.js +35 -22
  229. package/dist/transport/WaComms.js +27 -25
  230. package/dist/transport/WaWebSocket.js +148 -12
  231. package/dist/transport/binary/decoder.js +4 -4
  232. package/dist/transport/binary/encoder.js +12 -4
  233. package/dist/transport/index.js +7 -1
  234. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  235. package/dist/transport/node/WaNodeOrchestrator.js +2 -4
  236. package/dist/transport/node/WaNodeTransport.js +0 -3
  237. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  238. package/dist/transport/node/builders/index.js +12 -9
  239. package/dist/transport/node/builders/message.js +9 -0
  240. package/dist/transport/node/builders/pairing.js +4 -5
  241. package/dist/transport/node/builders/usync.js +45 -0
  242. package/dist/transport/node/helpers.js +112 -4
  243. package/dist/transport/node/usync.js +38 -0
  244. package/dist/transport/noise/WaFrameCodec.js +47 -32
  245. package/dist/transport/noise/WaNoiseCert.js +5 -8
  246. package/dist/transport/noise/WaNoiseSession.js +17 -10
  247. package/dist/transport/proxy.js +34 -0
  248. package/dist/transport/stream/parse.js +17 -53
  249. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  250. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  251. package/dist/types/appstate/constants.d.ts +1 -0
  252. package/dist/types/appstate/store/sqlite.d.ts +4 -18
  253. package/dist/types/appstate/utils.d.ts +0 -1
  254. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  255. package/dist/types/auth/index.d.ts +0 -2
  256. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  257. package/dist/types/auth/types.d.ts +6 -9
  258. package/dist/types/client/WaClient.d.ts +27 -25
  259. package/dist/types/client/WaClientFactory.d.ts +22 -23
  260. package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
  261. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  262. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  263. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  264. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
  265. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
  266. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
  267. package/dist/types/client/dirty.d.ts +1 -0
  268. package/dist/types/client/events/group.d.ts +2 -1
  269. package/dist/types/client/index.d.ts +1 -1
  270. package/dist/types/client/messaging/fanout.d.ts +14 -0
  271. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  272. package/dist/types/client/messaging/participants.d.ts +13 -0
  273. package/dist/types/client/types.d.ts +24 -1
  274. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  275. package/dist/types/crypto/core/index.d.ts +0 -1
  276. package/dist/types/crypto/core/random.d.ts +1 -7
  277. package/dist/types/crypto/index.d.ts +0 -2
  278. package/dist/types/index.d.ts +1 -1
  279. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  280. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  281. package/dist/types/infra/log/types.d.ts +1 -0
  282. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  283. package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
  284. package/dist/types/media/types.d.ts +5 -0
  285. package/dist/types/message/addon-crypto.d.ts +25 -0
  286. package/dist/types/message/index.d.ts +2 -0
  287. package/dist/types/message/reporting-token.d.ts +19 -0
  288. package/dist/types/message/use-case-secret.d.ts +20 -0
  289. package/dist/types/protocol/appstate.d.ts +58 -0
  290. package/dist/types/protocol/constants.d.ts +2 -1
  291. package/dist/types/protocol/index.d.ts +2 -10
  292. package/dist/types/protocol/jid.d.ts +3 -3
  293. package/dist/types/protocol/nodes.d.ts +2 -0
  294. package/dist/types/protocol/usync.d.ts +11 -0
  295. package/dist/types/retry/index.d.ts +1 -0
  296. package/dist/types/retry/replay.d.ts +0 -4
  297. package/dist/types/retry/tracker.d.ts +19 -0
  298. package/dist/types/retry/types.d.ts +4 -3
  299. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
  300. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  301. package/dist/types/signal/index.d.ts +1 -0
  302. package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
  303. package/dist/types/signal/session/resolver.d.ts +17 -0
  304. package/dist/types/store/contracts/appstate.store.d.ts +3 -0
  305. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  306. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  307. package/dist/types/store/contracts/message.store.d.ts +1 -0
  308. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  309. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  310. package/dist/types/store/contracts/signal.store.d.ts +6 -0
  311. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  312. package/dist/types/store/index.d.ts +1 -1
  313. package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
  314. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  315. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  316. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  317. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  318. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  319. package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
  320. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  321. package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
  322. package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
  323. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
  324. package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
  325. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
  326. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
  327. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
  328. package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
  329. package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
  330. package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
  331. package/dist/types/store/types.d.ts +3 -0
  332. package/dist/types/transport/WaWebSocket.d.ts +3 -0
  333. package/dist/types/transport/index.d.ts +2 -1
  334. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  335. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  336. package/dist/types/transport/node/builders/group.d.ts +4 -6
  337. package/dist/types/transport/node/builders/index.d.ts +2 -1
  338. package/dist/types/transport/node/builders/message.d.ts +14 -25
  339. package/dist/types/transport/node/builders/retry.d.ts +2 -4
  340. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  341. package/dist/types/transport/node/helpers.d.ts +8 -0
  342. package/dist/types/transport/node/usync.d.ts +2 -0
  343. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  344. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
  345. package/dist/types/transport/proxy.d.ts +6 -0
  346. package/dist/types/transport/stream/parse.d.ts +0 -1
  347. package/dist/types/transport/types.d.ts +18 -1
  348. package/dist/types/util/bytes.d.ts +5 -0
  349. package/dist/types/util/primitives.d.ts +3 -0
  350. package/dist/util/bytes.js +55 -33
  351. package/dist/util/coercion.js +6 -14
  352. package/dist/util/primitives.js +42 -14
  353. package/package.json +26 -5
  354. package/dist/crypto/core/encoding.js +0 -29
  355. package/dist/esm/crypto/core/encoding.js +0 -25
  356. package/dist/esm/util/base64.js +0 -18
  357. package/dist/esm/util/signal-address.js +0 -5
  358. package/dist/types/crypto/core/encoding.d.ts +0 -11
  359. package/dist/types/util/base64.d.ts +0 -4
  360. package/dist/types/util/signal-address.d.ts +0 -2
  361. package/dist/util/base64.js +0 -24
  362. package/dist/util/signal-address.js +0 -8
  363. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -11,36 +11,57 @@ exports.toUserJid = toUserJid;
11
11
  exports.normalizeDeviceJid = normalizeDeviceJid;
12
12
  exports.getLoginIdentity = getLoginIdentity;
13
13
  exports.parsePhoneJid = parsePhoneJid;
14
+ exports.signalAddressKey = signalAddressKey;
14
15
  const constants_1 = require("./constants");
15
- function splitJid(jid) {
16
- const atIndex = jid.indexOf('@');
17
- if (atIndex < 1 || atIndex >= jid.length - 1) {
18
- throw new Error(`invalid jid: ${jid}`);
16
+ function scanJid(jid) {
17
+ let atIndex = -1;
18
+ let colonIndex = -1;
19
+ let dotIndex = -1;
20
+ for (let index = 0; index < jid.length; index++) {
21
+ const code = jid.charCodeAt(index);
22
+ if (code === 64) {
23
+ atIndex = index;
24
+ break;
25
+ }
26
+ if (code === 58 && colonIndex === -1)
27
+ colonIndex = index;
28
+ else if (code === 46 && dotIndex === -1 && colonIndex === -1)
29
+ dotIndex = index;
19
30
  }
20
- return {
21
- user: jid.slice(0, atIndex),
22
- server: jid.slice(atIndex + 1)
23
- };
31
+ if (atIndex < 1 || atIndex >= jid.length - 1)
32
+ throw new Error(`invalid jid: ${jid}`);
33
+ return { atIndex, colonIndex, dotIndex };
34
+ }
35
+ function splitJid(jid) {
36
+ const { atIndex } = scanJid(jid);
37
+ return { user: jid.slice(0, atIndex), server: jid.slice(atIndex + 1) };
24
38
  }
25
39
  function normalizeRecipientJid(to) {
26
40
  const input = to.trim();
27
- if (input.length === 0) {
41
+ if (input.length === 0)
28
42
  throw new Error('recipient cannot be empty');
43
+ let hasDash = false;
44
+ let digits = '';
45
+ for (let index = 0; index < input.length; index += 1) {
46
+ const code = input.charCodeAt(index);
47
+ if (code === 64)
48
+ return input;
49
+ if (code === 45) {
50
+ hasDash = true;
51
+ continue;
52
+ }
53
+ if (code >= 48 && code <= 57)
54
+ digits += input[index];
29
55
  }
30
- if (input.includes('@')) {
31
- return input;
32
- }
33
- if (input.includes('-')) {
56
+ if (hasDash)
34
57
  return `${input}@${constants_1.WA_DEFAULTS.GROUP_SERVER}`;
35
- }
36
- const digits = input.replace(/\D/g, '');
37
- if (digits.length === 0) {
58
+ if (digits.length === 0)
38
59
  throw new Error(`invalid recipient: ${to}`);
39
- }
40
60
  return `${digits}@${constants_1.WA_DEFAULTS.HOST_DOMAIN}`;
41
61
  }
42
62
  function isJidType(jid, type) {
43
- return jid.endsWith(`@${type}`);
63
+ const atIndex = jid.length - type.length - 1;
64
+ return atIndex >= 1 && jid.charCodeAt(atIndex) === 64 && jid.endsWith(type);
44
65
  }
45
66
  function isGroupJid(jid) {
46
67
  return isJidType(jid, constants_1.WA_DEFAULTS.GROUP_SERVER);
@@ -52,26 +73,14 @@ function isGroupOrBroadcastJid(jid) {
52
73
  return isGroupJid(jid) || isBroadcastJid(jid);
53
74
  }
54
75
  function parseSignalAddressFromJid(jid) {
55
- const parsed = splitJid(jid);
56
- const colonIndex = parsed.user.indexOf(':');
57
- if (colonIndex === -1) {
58
- return {
59
- user: parsed.user,
60
- server: parsed.server,
61
- device: 0
62
- };
63
- }
64
- const user = parsed.user.slice(0, colonIndex);
65
- const deviceRaw = parsed.user.slice(colonIndex + 1);
66
- const device = Number.parseInt(deviceRaw, 10);
67
- if (!Number.isFinite(device) || device < 0) {
76
+ const { atIndex, colonIndex } = scanJid(jid);
77
+ const server = jid.slice(atIndex + 1);
78
+ if (colonIndex === -1)
79
+ return { user: jid.slice(0, atIndex), server, device: 0 };
80
+ const device = Number.parseInt(jid.slice(colonIndex + 1, atIndex), 10);
81
+ if (!Number.isFinite(device) || device < 0)
68
82
  throw new Error(`invalid jid device: ${jid}`);
69
- }
70
- return {
71
- user,
72
- server: parsed.server,
73
- device
74
- };
83
+ return { user: jid.slice(0, colonIndex), server, device };
75
84
  }
76
85
  function toUserJid(jid) {
77
86
  const address = parseSignalAddressFromJid(jid);
@@ -79,29 +88,33 @@ function toUserJid(jid) {
79
88
  }
80
89
  function normalizeDeviceJid(jid) {
81
90
  const address = parseSignalAddressFromJid(jid);
82
- if (address.device === 0) {
91
+ if (address.device === 0)
83
92
  return `${address.user}@${address.server}`;
84
- }
85
93
  return `${address.user}:${address.device}@${address.server}`;
86
94
  }
87
95
  function getLoginIdentity(meJid) {
88
- const parsed = splitJid(meJid);
89
- const [userAndAgent, devicePart = '0'] = parsed.user.split(':');
90
- const userPart = userAndAgent.split('.')[0];
91
- const username = Number.parseInt(userPart, 10);
92
- const device = Number.parseInt(devicePart, 10);
93
- if (!Number.isSafeInteger(username) || username <= 0) {
96
+ const { atIndex, colonIndex, dotIndex } = scanJid(meJid);
97
+ const userEndIndex = dotIndex === -1 ? (colonIndex === -1 ? atIndex : colonIndex) : dotIndex;
98
+ const username = Number.parseInt(meJid.slice(0, userEndIndex), 10);
99
+ const device = colonIndex === -1 ? 0 : Number.parseInt(meJid.slice(colonIndex + 1, atIndex), 10);
100
+ if (!Number.isSafeInteger(username) || username <= 0)
94
101
  throw new Error(`invalid numeric username from ${meJid}`);
95
- }
96
- if (!Number.isSafeInteger(device) || device < 0) {
102
+ if (!Number.isSafeInteger(device) || device < 0)
97
103
  throw new Error(`invalid device from ${meJid}`);
98
- }
99
104
  return { username, device };
100
105
  }
101
106
  function parsePhoneJid(input) {
102
- const digits = input.replace(/\D+/g, '');
103
- if (!digits) {
104
- throw new Error('phone number is empty after normalization');
107
+ let digits = '';
108
+ for (let index = 0; index < input.length; index += 1) {
109
+ const code = input.charCodeAt(index);
110
+ if (code >= 48 && code <= 57)
111
+ digits += input[index];
105
112
  }
113
+ if (!digits)
114
+ throw new Error('phone number is empty after normalization');
106
115
  return `${digits}@${constants_1.WA_DEFAULTS.HOST_DOMAIN}`;
107
116
  }
117
+ function signalAddressKey(address) {
118
+ const server = address.server ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
119
+ return `${address.user}|${server}|${address.device}`;
120
+ }
@@ -17,8 +17,8 @@ exports.WA_MEDIA_HKDF_INFO = Object.freeze({
17
17
  });
18
18
  exports.WA_PREVIEW_MEDIA_HKDF_INFO = 'Messenger Preview Keys';
19
19
  function getWaMediaHkdfInfo(mediaType) {
20
- if (mediaType in exports.WA_MEDIA_HKDF_INFO) {
21
- return exports.WA_MEDIA_HKDF_INFO[mediaType];
22
- }
20
+ const info = exports.WA_MEDIA_HKDF_INFO[mediaType];
21
+ if (info !== undefined)
22
+ return info;
23
23
  throw new Error(`unsupported media type: ${mediaType}`);
24
24
  }
@@ -26,6 +26,8 @@ exports.WA_NODE_TAGS = Object.freeze({
26
26
  KEY_FETCH: 'key_fetch',
27
27
  LIST: 'list',
28
28
  USER: 'user',
29
+ CONTACT: 'contact',
30
+ LID: 'lid',
29
31
  PICTURE: 'picture',
30
32
  PRIVACY: 'privacy',
31
33
  PARTICIPATING: 'participating',
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WA_USYNC_DEFAULTS = exports.WA_USYNC_CONTEXTS = exports.WA_USYNC_MODES = void 0;
4
+ exports.WA_USYNC_MODES = Object.freeze({
5
+ QUERY: 'query'
6
+ });
7
+ exports.WA_USYNC_CONTEXTS = Object.freeze({
8
+ INTERACTIVE: 'interactive',
9
+ NOTIFICATION: 'notification'
10
+ });
11
+ exports.WA_USYNC_DEFAULTS = Object.freeze({
12
+ INDEX: '0',
13
+ LAST: 'true'
14
+ });
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- 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.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;
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; } });
@@ -17,3 +17,5 @@ Object.defineProperty(exports, "encodeRetryReplayPayload", { enumerable: true, g
17
17
  Object.defineProperty(exports, "pickRetryStateMax", { enumerable: true, get: function () { return outbound_1.pickRetryStateMax; } });
18
18
  var replay_1 = require("./replay");
19
19
  Object.defineProperty(exports, "WaRetryReplayService", { enumerable: true, get: function () { return replay_1.WaRetryReplayService; } });
20
+ var tracker_1 = require("./tracker");
21
+ Object.defineProperty(exports, "createOutboundRetryTracker", { enumerable: true, get: function () { return tracker_1.createOutboundRetryTracker; } });
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.encodeRetryReplayPayload = encodeRetryReplayPayload;
4
4
  exports.decodeRetryReplayPayload = decodeRetryReplayPayload;
5
5
  exports.pickRetryStateMax = pickRetryStateMax;
6
- const base64_1 = require("../util/base64");
7
6
  const bytes_1 = require("../util/bytes");
8
7
  function requireObject(value) {
9
8
  if (!value || typeof value !== 'object') {
@@ -23,7 +22,7 @@ function encodeRetryReplayPayload(payload) {
23
22
  mode: payload.mode,
24
23
  to: payload.to,
25
24
  type: payload.type,
26
- plaintext: (0, base64_1.bytesToBase64)(payload.plaintext)
25
+ plaintext: (0, bytes_1.bytesToBase64)(payload.plaintext)
27
26
  }
28
27
  : payload.mode === 'encrypted'
29
28
  ? {
@@ -31,12 +30,12 @@ function encodeRetryReplayPayload(payload) {
31
30
  to: payload.to,
32
31
  type: payload.type,
33
32
  encType: payload.encType,
34
- ciphertext: (0, base64_1.bytesToBase64)(payload.ciphertext),
33
+ ciphertext: (0, bytes_1.bytesToBase64)(payload.ciphertext),
35
34
  participant: payload.participant
36
35
  }
37
36
  : {
38
37
  mode: payload.mode,
39
- node: (0, base64_1.bytesToBase64)(payload.node)
38
+ node: (0, bytes_1.bytesToBase64)(payload.node)
40
39
  };
41
40
  return bytes_1.TEXT_ENCODER.encode(JSON.stringify(serialized));
42
41
  }
@@ -49,7 +48,7 @@ function decodeRetryReplayPayload(raw) {
49
48
  mode,
50
49
  to: requireString(parsed.to, 'to'),
51
50
  type: requireString(parsed.type, 'type'),
52
- plaintext: (0, base64_1.base64ToBytes)(requireString(parsed.plaintext, 'plaintext'), 'retry.plaintext')
51
+ plaintext: (0, bytes_1.base64ToBytesChecked)(requireString(parsed.plaintext, 'plaintext'), 'retry.plaintext')
53
52
  };
54
53
  }
55
54
  if (mode === 'encrypted') {
@@ -62,7 +61,7 @@ function decodeRetryReplayPayload(raw) {
62
61
  to: requireString(parsed.to, 'to'),
63
62
  type: requireString(parsed.type, 'type'),
64
63
  encType,
65
- ciphertext: (0, base64_1.base64ToBytes)(requireString(parsed.ciphertext, 'ciphertext'), 'retry.ciphertext'),
64
+ ciphertext: (0, bytes_1.base64ToBytesChecked)(requireString(parsed.ciphertext, 'ciphertext'), 'retry.ciphertext'),
66
65
  participant: parsed.participant === undefined
67
66
  ? undefined
68
67
  : requireString(parsed.participant, 'participant')
@@ -71,7 +70,7 @@ function decodeRetryReplayPayload(raw) {
71
70
  if (mode === 'opaque_node') {
72
71
  return {
73
72
  mode,
74
- node: (0, base64_1.base64ToBytes)(requireString(parsed.node, 'node'), 'retry.node')
73
+ node: (0, bytes_1.base64ToBytesChecked)(requireString(parsed.node, 'node'), 'retry.node')
75
74
  };
76
75
  }
77
76
  throw new Error(`invalid retry replay payload mode: ${mode}`);
@@ -4,7 +4,7 @@ exports.parseRetryReceiptRequest = parseRetryReceiptRequest;
4
4
  const constants_1 = require("../protocol/constants");
5
5
  const constants_2 = require("../signal/api/constants");
6
6
  const helpers_1 = require("../transport/node/helpers");
7
- const parse_1 = require("../transport/stream/parse");
7
+ const primitives_1 = require("../util/primitives");
8
8
  function parseFixedLengthBytes(value, byteLength, field) {
9
9
  const out = (0, helpers_1.decodeNodeContentBase64OrBytes)(value, field);
10
10
  if (out.byteLength !== byteLength) {
@@ -13,81 +13,62 @@ function parseFixedLengthBytes(value, byteLength, field) {
13
13
  return out;
14
14
  }
15
15
  function parseBigEndianUint(bytes, field) {
16
- if (bytes.byteLength === 0 || bytes.byteLength > 4) {
17
- throw new Error(`${field} has invalid byte length`);
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`);
18
27
  }
19
- const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
20
- if (bytes.byteLength === 1) {
21
- return view.getUint8(0);
22
- }
23
- if (bytes.byteLength === 2) {
24
- return view.getUint16(0);
25
- }
26
- return bytes.byteLength === 3 ? (view.getUint16(0) << 8) | view.getUint8(2) : view.getUint32(0);
27
- }
28
- function parseRetryType(value) {
29
- if (value === 'retry' || value === 'enc_rekey_retry') {
30
- return value;
31
- }
32
- return null;
33
28
  }
34
- function parseRetryCount(value) {
35
- const parsed = (0, parse_1.parseOptionalInt)(value);
36
- if (parsed === undefined) {
37
- return 0;
38
- }
39
- if (parsed < 0) {
40
- throw new Error('retry count must be >= 0');
41
- }
42
- return parsed;
43
- }
44
- function parseRetryReason(value) {
45
- const parsed = (0, parse_1.parseOptionalInt)(value);
46
- if (parsed === undefined) {
47
- return undefined;
48
- }
49
- if (parsed < 0) {
50
- throw new Error('retry reason must be >= 0');
29
+ function requireNode(node, message) {
30
+ if (!node) {
31
+ throw new Error(message);
51
32
  }
52
- return parsed;
33
+ return node;
53
34
  }
54
35
  function parseRetryKeyBundle(node) {
55
36
  if (!node) {
56
37
  return undefined;
57
38
  }
58
- const identityNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.IDENTITY);
59
- const signedKeyNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.SKEY);
60
- if (!identityNode || !signedKeyNode) {
61
- throw new Error('retry keys section missing identity or skey');
62
- }
63
- const signedKeyIdNode = (0, helpers_1.findNodeChild)(signedKeyNode, constants_1.WA_NODE_TAGS.ID);
64
- const signedKeyValueNode = (0, helpers_1.findNodeChild)(signedKeyNode, constants_1.WA_NODE_TAGS.VALUE);
65
- const signedKeySignatureNode = (0, helpers_1.findNodeChild)(signedKeyNode, constants_1.WA_NODE_TAGS.SIGNATURE);
66
- if (!signedKeyIdNode || !signedKeyValueNode || !signedKeySignatureNode) {
67
- throw new Error('retry keys section has incomplete skey');
68
- }
69
- const keyNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.KEY);
70
- const keyIdNode = keyNode ? (0, helpers_1.findNodeChild)(keyNode, constants_1.WA_NODE_TAGS.ID) : undefined;
71
- const keyValueNode = keyNode ? (0, helpers_1.findNodeChild)(keyNode, constants_1.WA_NODE_TAGS.VALUE) : undefined;
72
- if (keyNode && (!keyIdNode || !keyValueNode)) {
73
- throw new Error('retry keys section has incomplete key');
74
- }
75
- const deviceIdentityNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.DEVICE_IDENTITY);
39
+ const [identityNode, signedKeyNode, keyNode, deviceIdentityNode] = (0, helpers_1.findNodeChildrenByTags)(node, [constants_1.WA_NODE_TAGS.IDENTITY, constants_1.WA_NODE_TAGS.SKEY, constants_1.WA_NODE_TAGS.KEY, constants_1.WA_NODE_TAGS.DEVICE_IDENTITY]);
40
+ const identity = requireNode(identityNode, 'retry keys section missing identity or skey');
41
+ const signedKey = requireNode(signedKeyNode, 'retry keys section missing identity or skey');
42
+ const [signedKeyIdNode, signedKeyValueNode, signedKeySignatureNode] = (0, helpers_1.findNodeChildrenByTags)(signedKey, [constants_1.WA_NODE_TAGS.ID, constants_1.WA_NODE_TAGS.VALUE, constants_1.WA_NODE_TAGS.SIGNATURE]);
43
+ const signedKeyId = requireNode(signedKeyIdNode, 'retry keys section has incomplete skey');
44
+ const signedKeyValue = requireNode(signedKeyValueNode, 'retry keys section has incomplete skey');
45
+ const signedKeySignature = requireNode(signedKeySignatureNode, 'retry keys section has incomplete skey');
46
+ let keyIdNode;
47
+ let keyValueNode;
48
+ if (keyNode) {
49
+ const keyNodes = (0, helpers_1.findNodeChildrenByTags)(keyNode, [constants_1.WA_NODE_TAGS.ID, constants_1.WA_NODE_TAGS.VALUE]);
50
+ keyIdNode = keyNodes[0];
51
+ keyValueNode = keyNodes[1];
52
+ }
53
+ const keyId = keyNode ? requireNode(keyIdNode, 'retry keys section has incomplete key') : null;
54
+ const keyValue = keyNode
55
+ ? requireNode(keyValueNode, 'retry keys section has incomplete key')
56
+ : null;
76
57
  return {
77
- identity: parseFixedLengthBytes(identityNode.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.identity'),
58
+ identity: parseFixedLengthBytes(identity.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.identity'),
78
59
  deviceIdentity: deviceIdentityNode
79
60
  ? (0, helpers_1.decodeNodeContentBase64OrBytes)(deviceIdentityNode.content, 'retry.keys.device-identity')
80
61
  : undefined,
81
- key: keyIdNode && keyValueNode
62
+ key: keyId && keyValue
82
63
  ? {
83
- id: parseBigEndianUint(parseFixedLengthBytes(keyIdNode.content, constants_2.SIGNAL_KEY_ID_LENGTH, 'retry.keys.key.id'), 'retry.keys.key.id'),
84
- publicKey: parseFixedLengthBytes(keyValueNode.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.key.value')
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')
85
66
  }
86
67
  : undefined,
87
68
  skey: {
88
- id: parseBigEndianUint(parseFixedLengthBytes(signedKeyIdNode.content, constants_2.SIGNAL_KEY_ID_LENGTH, 'retry.keys.skey.id'), 'retry.keys.skey.id'),
89
- publicKey: parseFixedLengthBytes(signedKeyValueNode.content, constants_2.SIGNAL_KEY_DATA_LENGTH, 'retry.keys.skey.value'),
90
- signature: parseFixedLengthBytes(signedKeySignatureNode.content, constants_2.SIGNAL_SIGNATURE_LENGTH, 'retry.keys.skey.signature')
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')
91
72
  }
92
73
  };
93
74
  }
@@ -95,7 +76,9 @@ function parseRetryReceiptRequest(node) {
95
76
  if (node.tag !== constants_1.WA_MESSAGE_TAGS.RECEIPT) {
96
77
  return null;
97
78
  }
98
- const receiptType = parseRetryType(node.attrs.type);
79
+ const receiptType = node.attrs.type === 'retry' || node.attrs.type === 'enc_rekey_retry'
80
+ ? node.attrs.type
81
+ : null;
99
82
  if (!receiptType) {
100
83
  return null;
101
84
  }
@@ -104,19 +87,18 @@ function parseRetryReceiptRequest(node) {
104
87
  if (!stanzaId || !from) {
105
88
  throw new Error('retry receipt is missing id/from attrs');
106
89
  }
107
- const retryNode = (0, helpers_1.findNodeChild)(node, 'retry');
108
- if (!retryNode) {
109
- throw new Error('retry receipt is missing retry child');
110
- }
111
- const registrationNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.REGISTRATION);
112
- if (!registrationNode) {
113
- throw new Error('retry receipt is missing registration child');
114
- }
115
- const originalMsgId = retryNode.attrs.id;
90
+ const [retryNode, registrationNode, keysNode] = (0, helpers_1.findNodeChildrenByTags)(node, [
91
+ 'retry',
92
+ constants_1.WA_NODE_TAGS.REGISTRATION,
93
+ 'keys'
94
+ ]);
95
+ const retry = requireNode(retryNode, 'retry receipt is missing retry child');
96
+ const registrationNodeValue = requireNode(registrationNode, 'retry receipt is missing registration child');
97
+ const originalMsgId = retry.attrs.id;
116
98
  if (!originalMsgId) {
117
99
  throw new Error('retry receipt is missing retry.id');
118
100
  }
119
- const registration = parseFixedLengthBytes(registrationNode.content, constants_2.SIGNAL_REGISTRATION_ID_LENGTH, 'retry.registration');
101
+ const registration = parseFixedLengthBytes(registrationNodeValue.content, constants_2.SIGNAL_REGISTRATION_ID_LENGTH, 'retry.registration');
120
102
  return {
121
103
  type: receiptType,
122
104
  stanzaId,
@@ -124,10 +106,10 @@ function parseRetryReceiptRequest(node) {
124
106
  participant: node.attrs.participant,
125
107
  recipient: node.attrs.recipient,
126
108
  originalMsgId,
127
- retryCount: parseRetryCount(retryNode.attrs.count),
128
- retryReason: parseRetryReason(retryNode.attrs.error ?? node.attrs.error),
129
- t: retryNode.attrs.t ?? node.attrs.t,
109
+ retryCount: (0, primitives_1.parseOptionalInt)(retry.attrs.count) ?? 0,
110
+ retryReason: (0, primitives_1.parseOptionalInt)(retry.attrs.error ?? node.attrs.error),
111
+ t: retry.attrs.t ?? node.attrs.t,
130
112
  regId: parseBigEndianUint(registration, 'retry.registration'),
131
- keyBundle: parseRetryKeyBundle((0, helpers_1.findNodeChild)(node, 'keys'))
113
+ keyBundle: parseRetryKeyBundle(keysNode)
132
114
  };
133
115
  }
@@ -16,17 +16,19 @@ class WaRetryReplayService {
16
16
  }
17
17
  async resendOutboundMessage(outbound, requesterJid, retryCount) {
18
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);
19
21
  if (payload.mode === 'plaintext') {
20
- return this.resendPlaintextPayload(outbound, payload, requesterJid, retryCount);
22
+ return this.resendPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount);
21
23
  }
22
24
  if (payload.mode === 'encrypted') {
23
- return this.resendEncryptedPayload(outbound, payload, requesterJid, retryCount);
25
+ return this.resendEncryptedPayload(outbound, payload, requesterJid, normalizedRequesterJid, retryCount);
24
26
  }
25
- return this.resendOpaquePayload(outbound, payload, requesterJid);
27
+ return this.resendOpaquePayload(outbound, payload, normalizedRequesterJid);
26
28
  }
27
- async resendPlaintextPayload(outbound, payload, requesterJid, retryCount) {
29
+ async resendPlaintextPayload(outbound, payload, requesterJid, requesterAddress, retryCount) {
28
30
  if ((0, jid_1.isGroupOrBroadcastJid)(payload.to)) {
29
- return this.resendGroupPlaintextPayload(outbound, payload, requesterJid);
31
+ return this.resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress);
30
32
  }
31
33
  let payloadUserJid;
32
34
  let requesterUserJid;
@@ -40,8 +42,8 @@ class WaRetryReplayService {
40
42
  if (payloadUserJid !== requesterUserJid) {
41
43
  return 'ineligible';
42
44
  }
43
- const encrypted = await this.signalProtocol.encryptMessage((0, jid_1.parseSignalAddressFromJid)(requesterJid), payload.plaintext);
44
- await this.messageClient.sendEncrypted({
45
+ const encrypted = await this.options.signalProtocol.encryptMessage(requesterAddress, payload.plaintext);
46
+ await this.options.messageClient.sendEncrypted({
45
47
  to: requesterJid,
46
48
  encType: encrypted.type,
47
49
  ciphertext: encrypted.ciphertext,
@@ -51,15 +53,15 @@ class WaRetryReplayService {
51
53
  });
52
54
  return 'resent';
53
55
  }
54
- async resendGroupPlaintextPayload(outbound, payload, requesterJid) {
56
+ async resendGroupPlaintextPayload(outbound, payload, requesterJid, requesterAddress) {
55
57
  const plaintext = (await this.maybeWrapGroupRetryPlaintextForSelfDevice(payload, requesterJid)) ??
56
58
  payload.plaintext;
57
- const encrypted = await this.signalProtocol.encryptMessage((0, jid_1.parseSignalAddressFromJid)(requesterJid), plaintext);
59
+ const encrypted = await this.options.signalProtocol.encryptMessage(requesterAddress, plaintext);
58
60
  let deviceIdentity;
59
61
  if (encrypted.type === 'pkmsg') {
60
- const signedIdentity = this.getCurrentSignedIdentity();
62
+ const signedIdentity = this.options.getCurrentSignedIdentity();
61
63
  if (!signedIdentity) {
62
- this.logger.warn('retry request rejected: missing signed identity for pkmsg group retry');
64
+ this.options.logger.warn('retry request rejected: missing signed identity for pkmsg group retry');
63
65
  return 'ineligible';
64
66
  }
65
67
  deviceIdentity = _proto_1.proto.ADVSignedDeviceIdentity.encode(signedIdentity).finish();
@@ -69,22 +71,22 @@ class WaRetryReplayService {
69
71
  type: payload.type,
70
72
  id: outbound.messageId,
71
73
  requesterJid,
72
- addressingMode: (0, jid_1.splitJid)(requesterJid).server === 'lid' ? 'lid' : 'pn',
74
+ addressingMode: requesterAddress.server === 'lid' ? 'lid' : 'pn',
73
75
  encType: encrypted.type,
74
76
  ciphertext: encrypted.ciphertext,
75
77
  deviceIdentity
76
78
  });
77
- await this.messageClient.sendMessageNode(retryNode);
79
+ await this.options.messageClient.sendMessageNode(retryNode);
78
80
  return 'resent';
79
81
  }
80
- async resendEncryptedPayload(outbound, payload, requesterJid, retryCount) {
82
+ async resendEncryptedPayload(outbound, payload, requesterJid, normalizedRequesterJid, retryCount) {
81
83
  if (payload.encType === 'skmsg') {
82
84
  return 'ineligible';
83
85
  }
84
- if ((0, jid_1.normalizeDeviceJid)(payload.to) !== (0, jid_1.normalizeDeviceJid)(requesterJid)) {
86
+ if ((0, jid_1.normalizeDeviceJid)(payload.to) !== normalizedRequesterJid) {
85
87
  return 'ineligible';
86
88
  }
87
- await this.messageClient.sendEncrypted({
89
+ await this.options.messageClient.sendEncrypted({
88
90
  to: requesterJid,
89
91
  encType: payload.encType,
90
92
  ciphertext: payload.ciphertext,
@@ -95,8 +97,11 @@ class WaRetryReplayService {
95
97
  });
96
98
  return 'resent';
97
99
  }
98
- async resendOpaquePayload(outbound, payload, requesterJid) {
100
+ async resendOpaquePayload(outbound, payload, normalizedRequesterJid) {
99
101
  const decoded = (0, binary_1.decodeBinaryNode)(payload.node);
102
+ if (!this.isOpaqueReplayCompatible(decoded, normalizedRequesterJid)) {
103
+ return 'ineligible';
104
+ }
100
105
  const replayNode = decoded.attrs.id === outbound.messageId
101
106
  ? decoded
102
107
  : {
@@ -106,10 +111,7 @@ class WaRetryReplayService {
106
111
  id: outbound.messageId
107
112
  }
108
113
  };
109
- if (!this.isOpaqueReplayCompatible(replayNode, requesterJid)) {
110
- return 'ineligible';
111
- }
112
- await this.messageClient.sendMessageNode(replayNode);
114
+ await this.options.messageClient.sendMessageNode(replayNode);
113
115
  return 'resent';
114
116
  }
115
117
  async maybeWrapGroupRetryPlaintextForSelfDevice(payload, requesterJid) {
@@ -123,7 +125,7 @@ class WaRetryReplayService {
123
125
  return (0, padding_1.writeRandomPadMax16)(_proto_1.proto.Message.encode(wrapped).finish());
124
126
  }
125
127
  catch (error) {
126
- this.logger.warn('retry request failed to wrap deviceSent payload for self requester', {
128
+ this.options.logger.warn('retry request failed to wrap deviceSent payload for self requester', {
127
129
  requester: requesterJid,
128
130
  to: payload.to,
129
131
  message: (0, primitives_1.toError)(error).message
@@ -143,38 +145,35 @@ class WaRetryReplayService {
143
145
  }
144
146
  return false;
145
147
  }
146
- get logger() {
147
- return this.options.logger;
148
- }
149
- get messageClient() {
150
- return this.options.messageClient;
151
- }
152
- get signalProtocol() {
153
- return this.options.signalProtocol;
154
- }
155
- getCurrentSignedIdentity() {
156
- return this.options.getCurrentSignedIdentity();
157
- }
158
- isOpaqueReplayCompatible(node, requesterJid) {
159
- const requester = (0, jid_1.normalizeDeviceJid)(requesterJid);
148
+ isOpaqueReplayCompatible(node, normalizedRequesterJid) {
160
149
  const participantsNode = (0, helpers_1.findNodeChild)(node, 'participants');
161
150
  if (participantsNode) {
162
- const toNodes = (0, helpers_1.getNodeChildrenByTag)(participantsNode, 'to');
163
- if (toNodes.length !== 1) {
164
- return false;
151
+ const participantsContent = Array.isArray(participantsNode.content)
152
+ ? participantsNode.content
153
+ : [];
154
+ let participantNode;
155
+ let participantCount = 0;
156
+ for (let index = 0; index < participantsContent.length; index++) {
157
+ const child = participantsContent[index];
158
+ if (child.tag !== 'to')
159
+ continue;
160
+ participantCount++;
161
+ if (participantCount > 1)
162
+ return false;
163
+ participantNode = child;
165
164
  }
166
- const participantJid = toNodes[0].attrs.jid;
167
- if (!participantJid) {
165
+ if (participantCount !== 1 || !participantNode)
168
166
  return false;
169
- }
170
- return (0, jid_1.normalizeDeviceJid)(participantJid) === requester;
167
+ const participantJid = participantNode.attrs.jid;
168
+ if (!participantJid)
169
+ return false;
170
+ return (0, jid_1.normalizeDeviceJid)(participantJid) === normalizedRequesterJid;
171
171
  }
172
172
  if (node.attrs.participant) {
173
- return (0, jid_1.normalizeDeviceJid)(node.attrs.participant) === requester;
174
- }
175
- if (node.attrs.to) {
176
- return (0, jid_1.normalizeDeviceJid)(node.attrs.to) === requester;
173
+ return (0, jid_1.normalizeDeviceJid)(node.attrs.participant) === normalizedRequesterJid;
177
174
  }
175
+ if (node.attrs.to)
176
+ return (0, jid_1.normalizeDeviceJid)(node.attrs.to) === normalizedRequesterJid;
178
177
  return false;
179
178
  }
180
179
  }