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
@@ -1,12 +1,16 @@
1
1
  import { createCipheriv, createDecipheriv, createHash, createHmac } from 'node:crypto';
2
2
  import { once } from 'node:events';
3
+ import { createWriteStream } from 'node:fs';
4
+ import { stat, unlink } from 'node:fs/promises';
5
+ import { tmpdir } from 'node:os';
6
+ import { join } from 'node:path';
3
7
  import { PassThrough } from 'node:stream';
4
8
  import { hkdf } from '../crypto/core/hkdf.js';
5
9
  import { aesCbcDecrypt, aesCbcEncrypt, hmacSign, importAesCbcKey, importHmacKey, sha256 } from '../crypto/core/primitives.js';
6
10
  import { randomBytesAsync } from '../crypto/core/random.js';
7
11
  import { ENC_KEY_END, ENC_KEY_START, HMAC_TRUNCATED_SIZE, IV_SIZE, MAC_KEY_END, MAC_KEY_START, MEDIA_HKDF_SIZE } from './constants.js';
8
12
  import { WA_APP_STATE_KEY_TYPES, getWaMediaHkdfInfo } from '../protocol/constants.js';
9
- import { assertByteLength, concatBytes, EMPTY_BYTES, readAllBytes, toChunkBytes, toBytesView, uint8Equal, uint8TimingSafeEqual } from '../util/bytes.js';
13
+ import { assertByteLength, concatBytes, EMPTY_BYTES, toChunkBytes, toBytesView, uint8Equal, uint8TimingSafeEqual } from '../util/bytes.js';
10
14
  import { toError } from '../util/primitives.js';
11
15
  export class WaMediaCrypto {
12
16
  static async generateMediaKey() {
@@ -77,17 +81,22 @@ export class WaMediaCrypto {
77
81
  const metadata = pumpEncryption(plaintext, encrypted, keys);
78
82
  return { encrypted, metadata };
79
83
  }
80
- static async decryptReadableToBytes(encrypted, options) {
81
- const decrypted = await WaMediaCrypto.decryptReadable(encrypted, options);
82
- const [plaintext, metadata] = await Promise.all([
83
- readAllBytes(decrypted.plaintext),
84
- decrypted.metadata
85
- ]);
86
- return {
87
- plaintext,
88
- fileSha256: metadata.fileSha256,
89
- fileEncSha256: metadata.fileEncSha256
90
- };
84
+ static async encryptToFile(mediaType, mediaKey, plaintext) {
85
+ const keys = await WaMediaCrypto.deriveKeys(mediaType, mediaKey);
86
+ const filePath = join(tmpdir(), `zapo-enc-${Date.now()}-${Math.random().toString(36).slice(2)}`);
87
+ const output = createWriteStream(filePath);
88
+ try {
89
+ const metadata = await pumpEncryptionToWritable(plaintext, output, keys);
90
+ const fileSize = (await stat(filePath)).size;
91
+ return { filePath, fileSize, ...metadata };
92
+ }
93
+ catch (error) {
94
+ await unlink(filePath).catch(() => undefined);
95
+ throw error;
96
+ }
97
+ }
98
+ static async cleanupEncryptedFile(filePath) {
99
+ await unlink(filePath).catch(() => undefined);
91
100
  }
92
101
  static async decryptReadable(encrypted, options) {
93
102
  const keys = await WaMediaCrypto.deriveKeys(options.mediaType, options.mediaKey);
@@ -108,6 +117,7 @@ async function pumpEncryption(plaintext, encrypted, keys) {
108
117
  const encHash = createHash('sha256');
109
118
  const hmac = createHmac('sha256', keys.macKey);
110
119
  const cipher = createCipheriv('aes-256-cbc', keys.encKey, keys.iv);
120
+ let plaintextLength = 0;
111
121
  hmac.update(keys.iv);
112
122
  try {
113
123
  for await (const chunk of plaintext) {
@@ -115,6 +125,7 @@ async function pumpEncryption(plaintext, encrypted, keys) {
115
125
  if (plainChunk.byteLength === 0) {
116
126
  continue;
117
127
  }
128
+ plaintextLength += plainChunk.byteLength;
118
129
  plainHash.update(plainChunk);
119
130
  const encryptedChunk = cipher.update(plainChunk);
120
131
  if (encryptedChunk.byteLength > 0) {
@@ -135,7 +146,8 @@ async function pumpEncryption(plaintext, encrypted, keys) {
135
146
  encrypted.end();
136
147
  return {
137
148
  fileSha256: toBytesView(plainHash.digest()),
138
- fileEncSha256: toBytesView(encHash.digest())
149
+ fileEncSha256: toBytesView(encHash.digest()),
150
+ plaintextLength
139
151
  };
140
152
  }
141
153
  catch (error) {
@@ -144,6 +156,76 @@ async function pumpEncryption(plaintext, encrypted, keys) {
144
156
  throw normalized;
145
157
  }
146
158
  }
159
+ async function writeChunkToWritable(stream, chunk) {
160
+ if (chunk.byteLength === 0) {
161
+ return;
162
+ }
163
+ if (stream.write(chunk)) {
164
+ return;
165
+ }
166
+ await new Promise((resolve, reject) => {
167
+ const onDrain = () => {
168
+ stream.off('error', onError);
169
+ resolve();
170
+ };
171
+ const onError = (err) => {
172
+ stream.off('drain', onDrain);
173
+ reject(err);
174
+ };
175
+ stream.once('drain', onDrain);
176
+ stream.once('error', onError);
177
+ });
178
+ }
179
+ async function endWritable(stream) {
180
+ return new Promise((resolve, reject) => {
181
+ stream.on('error', reject);
182
+ stream.end(() => resolve());
183
+ });
184
+ }
185
+ async function pumpEncryptionToWritable(plaintext, output, keys) {
186
+ const plainHash = createHash('sha256');
187
+ const encHash = createHash('sha256');
188
+ const hmac = createHmac('sha256', keys.macKey);
189
+ const cipher = createCipheriv('aes-256-cbc', keys.encKey, keys.iv);
190
+ let plaintextLength = 0;
191
+ hmac.update(keys.iv);
192
+ try {
193
+ for await (const chunk of plaintext) {
194
+ const plainChunk = toChunkBytes(chunk);
195
+ if (plainChunk.byteLength === 0) {
196
+ continue;
197
+ }
198
+ plaintextLength += plainChunk.byteLength;
199
+ plainHash.update(plainChunk);
200
+ const encryptedChunk = cipher.update(plainChunk);
201
+ if (encryptedChunk.byteLength > 0) {
202
+ hmac.update(encryptedChunk);
203
+ encHash.update(encryptedChunk);
204
+ await writeChunkToWritable(output, encryptedChunk);
205
+ }
206
+ }
207
+ const encryptedFinal = cipher.final();
208
+ if (encryptedFinal.byteLength > 0) {
209
+ hmac.update(encryptedFinal);
210
+ encHash.update(encryptedFinal);
211
+ await writeChunkToWritable(output, encryptedFinal);
212
+ }
213
+ const signature = hmac.digest().subarray(0, HMAC_TRUNCATED_SIZE);
214
+ encHash.update(signature);
215
+ await writeChunkToWritable(output, signature);
216
+ await endWritable(output);
217
+ return {
218
+ fileSha256: toBytesView(plainHash.digest()),
219
+ fileEncSha256: toBytesView(encHash.digest()),
220
+ plaintextLength
221
+ };
222
+ }
223
+ catch (error) {
224
+ const normalized = toError(error);
225
+ output.destroy(normalized);
226
+ throw normalized;
227
+ }
228
+ }
147
229
  async function pumpDecryption(encrypted, plaintext, keys, options) {
148
230
  const plainHash = createHash('sha256');
149
231
  const encHash = createHash('sha256');
@@ -86,14 +86,16 @@ export class WaMediaTransferClient {
86
86
  urls: urls.length,
87
87
  timeoutMs
88
88
  });
89
- return this.executeTransfer(urls, timeoutMs, request.signal, {
90
- responseLog: 'media download stream response',
91
- send: (url, signal) => this.transferRequest(url, {
92
- method: 'GET',
93
- headers,
94
- signal
95
- }, dispatcher, agent)
89
+ const result = await this.fetchWithFallback(urls, timeoutMs, request.signal, (url, signal) => this.transferRequest(url, {
90
+ method: 'GET',
91
+ headers,
92
+ signal
93
+ }, dispatcher, agent));
94
+ this.logger?.trace('media download stream response', {
95
+ url: result.url,
96
+ status: result.status
96
97
  });
98
+ return result;
97
99
  }
98
100
  async downloadBytes(request) {
99
101
  const response = await this.downloadStream(request);
@@ -101,7 +103,9 @@ export class WaMediaTransferClient {
101
103
  if (!response.body) {
102
104
  return EMPTY_BYTES;
103
105
  }
104
- return this.readAllBytesWithLimit(response.body, request.maxBytes);
106
+ return readAllBytes(response.body, {
107
+ maxBytes: request.maxBytes ?? this.defaultMaxReadBytes
108
+ });
105
109
  }
106
110
  async uploadStream(request) {
107
111
  const bodyIsBytes = request.body instanceof Uint8Array;
@@ -125,26 +129,28 @@ export class WaMediaTransferClient {
125
129
  timeoutMs,
126
130
  method
127
131
  });
128
- return this.executeTransfer(uploadUrls, timeoutMs, request.signal, {
129
- responseLog: 'media upload stream response',
130
- send: async (url, signal) => {
131
- if (bodyIsBytes) {
132
- return this.transferRequest(url, {
133
- method,
134
- headers,
135
- signal,
136
- body: request.body
137
- }, dispatcher, agent);
138
- }
132
+ const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal, async (url, signal) => {
133
+ if (bodyIsBytes) {
139
134
  return this.transferRequest(url, {
140
135
  method,
141
136
  headers,
142
137
  signal,
143
- body: request.body,
144
- duplex: 'half'
138
+ body: request.body
145
139
  }, dispatcher, agent);
146
140
  }
141
+ return this.transferRequest(url, {
142
+ method,
143
+ headers,
144
+ signal,
145
+ body: request.body,
146
+ duplex: 'half'
147
+ }, dispatcher, agent);
148
+ });
149
+ this.logger?.trace('media upload stream response', {
150
+ url: result.url,
151
+ status: result.status
147
152
  });
153
+ return result;
148
154
  }
149
155
  async uploadEncrypted(request) {
150
156
  this.logger?.info('media encrypted upload start', {
@@ -181,7 +187,8 @@ export class WaMediaTransferClient {
181
187
  transfer,
182
188
  mediaKey,
183
189
  fileSha256: metadata.fileSha256,
184
- fileEncSha256: metadata.fileEncSha256
190
+ fileEncSha256: metadata.fileEncSha256,
191
+ plaintextLength: metadata.plaintextLength
185
192
  };
186
193
  }
187
194
  async downloadAndDecrypt(request) {
@@ -190,8 +197,12 @@ export class WaMediaTransferClient {
190
197
  });
191
198
  const decrypted = await this.downloadAndDecryptStream(request);
192
199
  try {
193
- const plaintext = await this.readAllBytesWithLimit(decrypted.plaintext, request.maxBytes);
194
- await decrypted.metadata;
200
+ const [plaintext] = await Promise.all([
201
+ readAllBytes(decrypted.plaintext, {
202
+ maxBytes: request.maxBytes ?? this.defaultMaxReadBytes
203
+ }),
204
+ decrypted.metadata
205
+ ]);
195
206
  this.logger?.info('media encrypted download completed', {
196
207
  byteLength: plaintext.byteLength
197
208
  });
@@ -225,7 +236,7 @@ export class WaMediaTransferClient {
225
236
  if (!response.body) {
226
237
  return EMPTY_BYTES;
227
238
  }
228
- return this.readAllBytesWithLimit(response.body, maxBytes);
239
+ return readAllBytes(response.body, { maxBytes: maxBytes ?? this.defaultMaxReadBytes });
229
240
  }
230
241
  async transferRequest(url, init, dispatcher, agent) {
231
242
  if (agent) {
@@ -246,7 +257,7 @@ export class WaMediaTransferClient {
246
257
  return {
247
258
  status: response.status,
248
259
  ok: response.ok,
249
- headers: this.headersToRecord(response.headers),
260
+ headers: Object.fromEntries(response.headers.entries()),
250
261
  body: response.body
251
262
  ? Readable.fromWeb(response.body)
252
263
  : null,
@@ -362,14 +373,6 @@ export class WaMediaTransferClient {
362
373
  timeoutMs: request.timeoutMs ?? this.defaultTimeoutMs
363
374
  };
364
375
  }
365
- async executeTransfer(urls, timeoutMs, signal, options) {
366
- const result = await this.fetchWithFallback(urls, timeoutMs, signal, options.send);
367
- this.logger?.trace(options.responseLog, {
368
- url: result.url,
369
- status: result.status
370
- });
371
- return result;
372
- }
373
376
  async prepareEncryptedUpload(request, mediaKey) {
374
377
  if (request.plaintext instanceof Uint8Array) {
375
378
  const encrypted = await WaMediaCrypto.encryptBytes(request.mediaType, mediaKey, request.plaintext);
@@ -378,7 +381,8 @@ export class WaMediaTransferClient {
378
381
  contentLength: encrypted.ciphertextHmac.byteLength,
379
382
  metadata: Promise.resolve({
380
383
  fileSha256: encrypted.fileSha256,
381
- fileEncSha256: encrypted.fileEncSha256
384
+ fileEncSha256: encrypted.fileEncSha256,
385
+ plaintextLength: request.plaintext.byteLength
382
386
  }),
383
387
  cleanup: async () => undefined
384
388
  };
@@ -432,11 +436,6 @@ export class WaMediaTransferClient {
432
436
  }
433
437
  return resolved;
434
438
  }
435
- readAllBytesWithLimit(stream, maxBytes) {
436
- return readAllBytes(stream, {
437
- maxBytes: maxBytes ?? this.defaultMaxReadBytes
438
- });
439
- }
440
439
  async fetchWithFallback(urls, timeoutMs, signal, send) {
441
440
  let lastError = null;
442
441
  for (let index = 0; index < urls.length; index += 1) {
@@ -506,13 +505,6 @@ export class WaMediaTransferClient {
506
505
  }
507
506
  };
508
507
  }
509
- headersToRecord(headers) {
510
- const output = {};
511
- headers.forEach((value, key) => {
512
- output[key] = value;
513
- });
514
- return output;
515
- }
516
508
  async drainBody(body) {
517
509
  if (!body) {
518
510
  return;
@@ -17,5 +17,6 @@ export const MEDIA_UPLOAD_PATHS = Object.freeze({
17
17
  document: '/mms/document',
18
18
  sticker: '/mms/sticker',
19
19
  gif: '/mms/gif',
20
- ptt: '/mms/ptt'
20
+ ptt: '/mms/ptt',
21
+ ptv: '/mms/video'
21
22
  });
@@ -1,5 +1,6 @@
1
1
  import { describeAckNode, isAckOrReceiptNode, isNegativeAckNode, isRetryableNegativeAck } from './ack.js';
2
2
  import { WA_DEFAULTS, WA_MESSAGE_TAGS, WA_MESSAGE_TYPES, WA_NODE_TAGS } from '../protocol/constants.js';
3
+ import { buildReceiptNode } from '../transport/node/builders/global.js';
3
4
  import { delay } from '../util/async.js';
4
5
  import { parseOptionalInt, toError } from '../util/primitives.js';
5
6
  const WA_RETRYABLE_PUBLISH_ERROR_RE = /timeout|socket|connection|closed/i;
@@ -112,6 +113,9 @@ export class WaMessageClient {
112
113
  if (input.id) {
113
114
  attrs.id = input.id;
114
115
  }
116
+ if (input.edit) {
117
+ attrs.edit = input.edit;
118
+ }
115
119
  if (input.category) {
116
120
  attrs.category = input.category;
117
121
  }
@@ -131,6 +135,9 @@ export class WaMessageClient {
131
135
  v: WA_MESSAGE_TYPES.ENC_VERSION,
132
136
  type: input.encType
133
137
  };
138
+ if (input.mediatype) {
139
+ encAttrs.mediatype = input.mediatype;
140
+ }
134
141
  if (input.encCount !== undefined && input.encCount > 0) {
135
142
  encAttrs.count = String(Math.trunc(input.encCount));
136
143
  }
@@ -148,6 +155,9 @@ export class WaMessageClient {
148
155
  content: input.deviceIdentity
149
156
  });
150
157
  }
158
+ if (input.metaNode) {
159
+ content.push(input.metaNode);
160
+ }
151
161
  const node = {
152
162
  tag: WA_MESSAGE_TAGS.MESSAGE,
153
163
  attrs,
@@ -156,29 +166,26 @@ export class WaMessageClient {
156
166
  return node;
157
167
  }
158
168
  async sendReceipt(input) {
159
- const attrs = {
169
+ const node = buildReceiptNode({
170
+ kind: 'outbound',
160
171
  to: input.to,
161
172
  id: input.id,
162
- type: input.type ?? 'read'
163
- };
164
- if (input.participant) {
165
- attrs.participant = input.participant;
166
- }
167
- if (input.from) {
168
- attrs.from = input.from;
169
- }
170
- if (input.t) {
171
- attrs.t = input.t;
172
- }
173
- this.logger.debug('sending receipt node', {
174
- to: attrs.to,
175
- id: attrs.id,
176
- type: attrs.type
173
+ type: input.type ?? 'read',
174
+ participant: input.participant,
175
+ recipient: input.recipient,
176
+ category: input.category,
177
+ from: input.from,
178
+ t: input.t,
179
+ peerParticipantPn: input.peerParticipantPn,
180
+ listIds: input.listIds,
181
+ content: input.content ? [...input.content] : undefined
177
182
  });
178
- await this.sendNode({
179
- tag: WA_MESSAGE_TAGS.RECEIPT,
180
- attrs
183
+ this.logger.debug('sending receipt node', {
184
+ to: node.attrs.to,
185
+ id: node.attrs.id,
186
+ type: node.attrs.type
181
187
  });
188
+ await this.sendNode(node);
182
189
  }
183
190
  isRetryablePublishError(error) {
184
191
  return WA_RETRYABLE_PUBLISH_ERROR_RE.test(error.message);
@@ -1,3 +1,5 @@
1
+ import { proto } from '../proto.js';
2
+ import { WA_EDIT_ATTRS, WA_ENC_MEDIA_TYPES, WA_EVENT_META_TYPES, WA_POLL_META_TYPES, WA_STANZA_MSG_TYPES } from '../protocol/constants.js';
1
3
  export function isSendMediaMessage(content) {
2
4
  return (!!content &&
3
5
  typeof content === 'object' &&
@@ -5,16 +7,200 @@ export function isSendMediaMessage(content) {
5
7
  'media' in content &&
6
8
  'mimetype' in content);
7
9
  }
10
+ function unwrapMessage(message) {
11
+ let msg = message;
12
+ for (;;) {
13
+ const inner = msg.ephemeralMessage?.message ??
14
+ msg.groupMentionedMessage?.message ??
15
+ msg.botInvokeMessage?.message ??
16
+ msg.deviceSentMessage?.message ??
17
+ msg.viewOnceMessage?.message ??
18
+ msg.viewOnceMessageV2?.message ??
19
+ msg.documentWithCaptionMessage?.message;
20
+ if (!inner)
21
+ return msg;
22
+ msg = inner;
23
+ }
24
+ }
8
25
  export function resolveMessageTypeAttr(message) {
9
- if (message.reactionMessage) {
10
- return 'reaction';
26
+ const msg = unwrapMessage(message);
27
+ if (msg.reactionMessage || msg.encReactionMessage) {
28
+ return WA_STANZA_MSG_TYPES.REACTION;
29
+ }
30
+ if (msg.eventMessage ||
31
+ msg.encEventResponseMessage ||
32
+ msg.secretEncryptedMessage?.secretEncType ===
33
+ proto.Message.SecretEncryptedMessage.SecretEncType.EVENT_EDIT) {
34
+ return WA_STANZA_MSG_TYPES.EVENT;
35
+ }
36
+ if (msg.pollCreationMessage ||
37
+ msg.pollCreationMessageV2 ||
38
+ msg.pollCreationMessageV3 ||
39
+ msg.pollCreationMessageV5 ||
40
+ msg.pollUpdateMessage ||
41
+ msg.secretEncryptedMessage?.secretEncType ===
42
+ proto.Message.SecretEncryptedMessage.SecretEncType.POLL_EDIT ||
43
+ msg.secretEncryptedMessage?.secretEncType ===
44
+ proto.Message.SecretEncryptedMessage.SecretEncType.POLL_ADD_OPTION) {
45
+ return WA_STANZA_MSG_TYPES.POLL;
46
+ }
47
+ if (msg.extendedTextMessage?.matchedText && msg.extendedTextMessage.matchedText.trim() !== '') {
48
+ return WA_STANZA_MSG_TYPES.MEDIA;
49
+ }
50
+ if ((msg.conversation !== undefined && msg.conversation !== null) ||
51
+ (msg.extendedTextMessage && !msg.extendedTextMessage.matchedText) ||
52
+ msg.protocolMessage ||
53
+ msg.interactiveMessage ||
54
+ msg.keepInChatMessage ||
55
+ msg.requestPhoneNumberMessage ||
56
+ msg.editedMessage ||
57
+ msg.pinInChatMessage ||
58
+ msg.encCommentMessage ||
59
+ msg.newsletterAdminInviteMessage ||
60
+ msg.pollResultSnapshotMessage ||
61
+ msg.pollResultSnapshotMessageV3 ||
62
+ msg.templateButtonReplyMessage ||
63
+ msg.messageHistoryNotice ||
64
+ msg.secretEncryptedMessage?.secretEncType ===
65
+ proto.Message.SecretEncryptedMessage.SecretEncType.MESSAGE_EDIT ||
66
+ msg.secretEncryptedMessage?.secretEncType ===
67
+ proto.Message.SecretEncryptedMessage.SecretEncType.MESSAGE_SCHEDULE) {
68
+ return WA_STANZA_MSG_TYPES.TEXT;
69
+ }
70
+ return WA_STANZA_MSG_TYPES.MEDIA;
71
+ }
72
+ const REVOKED_REACTION_TEXT = '';
73
+ export function resolveEditAttr(message, subtype) {
74
+ const msg = unwrapMessage(message);
75
+ if (msg.protocolMessage) {
76
+ const protocolType = msg.protocolMessage.type;
77
+ if (protocolType === proto.Message.ProtocolMessage.Type.REVOKE) {
78
+ return subtype === 'admin_revoke'
79
+ ? WA_EDIT_ATTRS.ADMIN_REVOKE
80
+ : WA_EDIT_ATTRS.SENDER_REVOKE;
81
+ }
82
+ if (protocolType === proto.Message.ProtocolMessage.Type.MESSAGE_EDIT) {
83
+ return WA_EDIT_ATTRS.MESSAGE_EDIT;
84
+ }
85
+ return null;
86
+ }
87
+ if (msg.secretEncryptedMessage) {
88
+ const encType = msg.secretEncryptedMessage.secretEncType;
89
+ if (encType === proto.Message.SecretEncryptedMessage.SecretEncType.EVENT_EDIT ||
90
+ encType === proto.Message.SecretEncryptedMessage.SecretEncType.MESSAGE_EDIT) {
91
+ return WA_EDIT_ATTRS.MESSAGE_EDIT;
92
+ }
93
+ }
94
+ if (msg.editedMessage) {
95
+ return WA_EDIT_ATTRS.MESSAGE_EDIT;
96
+ }
97
+ if (msg.reactionMessage) {
98
+ if (msg.reactionMessage.text === REVOKED_REACTION_TEXT) {
99
+ return WA_EDIT_ATTRS.SENDER_REVOKE;
100
+ }
101
+ return null;
102
+ }
103
+ if (msg.keepInChatMessage) {
104
+ if (msg.keepInChatMessage.key?.fromMe === true &&
105
+ msg.keepInChatMessage.keepType === proto.KeepType.UNDO_KEEP_FOR_ALL) {
106
+ return WA_EDIT_ATTRS.SENDER_REVOKE;
107
+ }
108
+ return null;
109
+ }
110
+ if (msg.pinInChatMessage) {
111
+ return WA_EDIT_ATTRS.PIN_IN_CHAT;
112
+ }
113
+ return null;
114
+ }
115
+ export function resolveEncMediaType(message) {
116
+ const msg = unwrapMessage(message);
117
+ if (msg.imageMessage)
118
+ return WA_ENC_MEDIA_TYPES.IMAGE;
119
+ if (msg.stickerMessage)
120
+ return WA_ENC_MEDIA_TYPES.STICKER;
121
+ if (msg.locationMessage) {
122
+ return msg.locationMessage.isLive
123
+ ? WA_ENC_MEDIA_TYPES.LIVE_LOCATION
124
+ : WA_ENC_MEDIA_TYPES.LOCATION;
125
+ }
126
+ if (msg.contactMessage)
127
+ return WA_ENC_MEDIA_TYPES.VCARD;
128
+ if (msg.contactsArrayMessage)
129
+ return WA_ENC_MEDIA_TYPES.CONTACT_ARRAY;
130
+ if (msg.documentMessage)
131
+ return WA_ENC_MEDIA_TYPES.DOCUMENT;
132
+ if (msg.audioMessage) {
133
+ return msg.audioMessage.ptt ? WA_ENC_MEDIA_TYPES.PTT : WA_ENC_MEDIA_TYPES.AUDIO;
134
+ }
135
+ if (msg.videoMessage) {
136
+ return msg.videoMessage.gifPlayback ? WA_ENC_MEDIA_TYPES.GIF : WA_ENC_MEDIA_TYPES.VIDEO;
137
+ }
138
+ if (msg.ptvMessage)
139
+ return WA_ENC_MEDIA_TYPES.PTV;
140
+ if (msg.buttonsMessage)
141
+ return WA_ENC_MEDIA_TYPES.BUTTON;
142
+ if (msg.buttonsResponseMessage)
143
+ return WA_ENC_MEDIA_TYPES.BUTTON_RESPONSE;
144
+ if (msg.listMessage)
145
+ return WA_ENC_MEDIA_TYPES.LIST;
146
+ if (msg.listResponseMessage)
147
+ return WA_ENC_MEDIA_TYPES.LIST_RESPONSE;
148
+ if (msg.orderMessage)
149
+ return WA_ENC_MEDIA_TYPES.ORDER;
150
+ if (msg.productMessage)
151
+ return WA_ENC_MEDIA_TYPES.PRODUCT;
152
+ if (msg.groupInviteMessage)
153
+ return WA_ENC_MEDIA_TYPES.URL;
154
+ if (msg.interactiveResponseMessage)
155
+ return WA_ENC_MEDIA_TYPES.NATIVE_FLOW_RESPONSE;
156
+ if (msg.messageHistoryBundle)
157
+ return WA_ENC_MEDIA_TYPES.GROUP_HISTORY;
158
+ if (msg.extendedTextMessage?.matchedText && msg.extendedTextMessage.matchedText.trim() !== '') {
159
+ return WA_ENC_MEDIA_TYPES.URL;
160
+ }
161
+ return null;
162
+ }
163
+ export function resolveMetaAttrs(message) {
164
+ const msg = unwrapMessage(message);
165
+ let polltype;
166
+ let eventType;
167
+ let viewOnce;
168
+ if (msg.pollCreationMessage || msg.pollCreationMessageV2 || msg.pollCreationMessageV3) {
169
+ polltype = WA_POLL_META_TYPES.CREATION;
170
+ }
171
+ else if (msg.pollUpdateMessage) {
172
+ polltype = WA_POLL_META_TYPES.VOTE;
173
+ }
174
+ else if (msg.secretEncryptedMessage?.secretEncType ===
175
+ proto.Message.SecretEncryptedMessage.SecretEncType.POLL_EDIT) {
176
+ polltype = WA_POLL_META_TYPES.EDIT;
177
+ }
178
+ else if (msg.secretEncryptedMessage?.secretEncType ===
179
+ proto.Message.SecretEncryptedMessage.SecretEncType.POLL_ADD_OPTION) {
180
+ polltype = WA_POLL_META_TYPES.EDIT;
181
+ }
182
+ if (msg.eventMessage) {
183
+ eventType = WA_EVENT_META_TYPES.CREATION;
184
+ }
185
+ else if (msg.encEventResponseMessage) {
186
+ eventType = WA_EVENT_META_TYPES.RESPONSE;
187
+ }
188
+ else if (msg.secretEncryptedMessage?.secretEncType ===
189
+ proto.Message.SecretEncryptedMessage.SecretEncType.EVENT_EDIT) {
190
+ eventType = WA_EVENT_META_TYPES.EDIT;
191
+ }
192
+ if (message.viewOnceMessage || message.viewOnceMessageV2) {
193
+ viewOnce = 'true';
11
194
  }
12
- if (message.imageMessage ||
13
- message.videoMessage ||
14
- message.audioMessage ||
15
- message.documentMessage ||
16
- message.stickerMessage) {
17
- return 'media';
195
+ if (!polltype && !eventType && !viewOnce) {
196
+ return null;
18
197
  }
19
- return 'text';
198
+ const attrs = {};
199
+ if (polltype)
200
+ attrs.polltype = polltype;
201
+ if (eventType)
202
+ attrs.event_type = eventType;
203
+ if (viewOnce)
204
+ attrs.view_once = viewOnce;
205
+ return attrs;
20
206
  }