zapo-js 0.1.1 → 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 (589) hide show
  1. package/README.md +20 -4
  2. package/dist/appstate/WaAppStateCrypto.js +19 -26
  3. package/dist/appstate/WaAppStateSyncClient.js +293 -181
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  7. package/dist/appstate/index.js +8 -6
  8. package/dist/appstate/utils.js +9 -34
  9. package/dist/auth/WaAuthClient.js +43 -61
  10. package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
  11. package/dist/auth/index.js +1 -8
  12. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  13. package/dist/auth/pairing/WaPairingFlow.js +34 -26
  14. package/dist/auth/pairing/WaQrFlow.js +37 -24
  15. package/dist/client/WaClient.js +275 -324
  16. package/dist/client/WaClientFactory.js +500 -133
  17. package/dist/client/connection/WaConnectionManager.js +301 -0
  18. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  19. package/dist/client/connection/WaReceiptQueue.js +51 -0
  20. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  22. package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
  23. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  24. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
  25. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  26. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  27. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  28. package/dist/client/coordinators/WaRetryCoordinator.js +242 -57
  29. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  30. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  31. package/dist/client/dirty.js +74 -48
  32. package/dist/client/events/chat.js +4 -3
  33. package/dist/client/events/devices.js +72 -0
  34. package/dist/client/events/group.js +62 -47
  35. package/dist/client/events/identity.js +22 -0
  36. package/dist/client/events/privacy-token.js +39 -0
  37. package/dist/client/history-sync.js +94 -63
  38. package/dist/client/incoming.js +60 -27
  39. package/dist/client/mailbox.js +24 -23
  40. package/dist/client/messages.js +107 -31
  41. package/dist/client/messaging/fanout.js +199 -0
  42. package/dist/client/messaging/key-protocol.js +130 -0
  43. package/dist/client/messaging/participants.js +193 -0
  44. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  45. package/dist/client/tokens/cs-token.js +50 -0
  46. package/dist/client/tokens/tc-token.js +25 -0
  47. package/dist/crypto/core/hkdf.js +3 -8
  48. package/dist/crypto/core/index.js +2 -5
  49. package/dist/crypto/core/keys.js +6 -7
  50. package/dist/crypto/core/nonce.js +2 -0
  51. package/dist/crypto/core/primitives.js +12 -23
  52. package/dist/crypto/core/random.js +26 -23
  53. package/dist/crypto/curves/Ed25519.js +7 -8
  54. package/dist/crypto/curves/X25519.js +38 -22
  55. package/dist/crypto/index.js +1 -3
  56. package/dist/crypto/math/constants.js +13 -36
  57. package/dist/crypto/math/edwards.js +171 -44
  58. package/dist/crypto/math/fe.js +706 -0
  59. package/dist/crypto/math/mod.js +10 -3
  60. package/dist/esm/appstate/WaAppStateCrypto.js +7 -14
  61. package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
  62. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  63. package/dist/esm/appstate/constants.js +3 -2
  64. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  65. package/dist/esm/appstate/index.js +2 -2
  66. package/dist/esm/appstate/utils.js +8 -30
  67. package/dist/esm/auth/WaAuthClient.js +43 -61
  68. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
  69. package/dist/esm/auth/index.js +0 -3
  70. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  71. package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
  72. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  73. package/dist/esm/client/WaClient.js +275 -324
  74. package/dist/esm/client/WaClientFactory.js +501 -134
  75. package/dist/esm/client/connection/WaConnectionManager.js +297 -0
  76. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  77. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  78. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  79. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  80. package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
  81. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  82. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
  83. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  84. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  85. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  86. package/dist/esm/client/coordinators/WaRetryCoordinator.js +244 -59
  87. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  88. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  89. package/dist/esm/client/dirty.js +69 -43
  90. package/dist/esm/client/events/chat.js +4 -3
  91. package/dist/esm/client/events/devices.js +68 -0
  92. package/dist/esm/client/events/group.js +53 -39
  93. package/dist/esm/client/events/identity.js +19 -0
  94. package/dist/esm/client/events/privacy-token.js +36 -0
  95. package/dist/esm/client/history-sync.js +91 -60
  96. package/dist/esm/client/incoming.js +61 -28
  97. package/dist/esm/client/mailbox.js +24 -23
  98. package/dist/esm/client/messages.js +108 -32
  99. package/dist/esm/client/messaging/fanout.js +196 -0
  100. package/dist/esm/client/messaging/key-protocol.js +127 -0
  101. package/dist/esm/client/messaging/participants.js +190 -0
  102. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  103. package/dist/esm/client/tokens/cs-token.js +46 -0
  104. package/dist/esm/client/tokens/tc-token.js +18 -0
  105. package/dist/esm/crypto/core/hkdf.js +3 -8
  106. package/dist/esm/crypto/core/index.js +2 -3
  107. package/dist/esm/crypto/core/keys.js +3 -4
  108. package/dist/esm/crypto/core/nonce.js +2 -0
  109. package/dist/esm/crypto/core/primitives.js +12 -22
  110. package/dist/esm/crypto/core/random.js +25 -23
  111. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  112. package/dist/esm/crypto/curves/X25519.js +35 -19
  113. package/dist/esm/crypto/index.js +0 -1
  114. package/dist/esm/crypto/math/constants.js +12 -35
  115. package/dist/esm/crypto/math/edwards.js +174 -47
  116. package/dist/esm/crypto/math/fe.js +691 -0
  117. package/dist/esm/crypto/math/mod.js +10 -1
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  120. package/dist/esm/infra/log/PinoLogger.js +15 -9
  121. package/dist/esm/infra/log/types.js +11 -1
  122. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  123. package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
  124. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  125. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  126. package/dist/esm/infra/perf/StoreLock.js +77 -0
  127. package/dist/esm/media/WaMediaCrypto.js +96 -16
  128. package/dist/esm/media/WaMediaTransferClient.js +251 -91
  129. package/dist/esm/media/conn.js +10 -6
  130. package/dist/esm/media/constants.js +6 -2
  131. package/dist/esm/message/WaMessageClient.js +30 -32
  132. package/dist/esm/message/ack.js +6 -6
  133. package/dist/esm/message/addon-crypto.js +59 -0
  134. package/dist/esm/message/content.js +195 -9
  135. package/dist/esm/message/icdc.js +76 -0
  136. package/dist/esm/message/incoming.js +129 -122
  137. package/dist/esm/message/index.js +2 -0
  138. package/dist/esm/message/phash.js +3 -1
  139. package/dist/esm/message/reporting-token.js +425 -0
  140. package/dist/esm/message/use-case-secret.js +49 -0
  141. package/dist/esm/protocol/appstate.js +27 -0
  142. package/dist/esm/protocol/browser.js +10 -18
  143. package/dist/esm/protocol/constants.js +6 -3
  144. package/dist/esm/protocol/defaults.js +6 -0
  145. package/dist/esm/protocol/index.js +2 -11
  146. package/dist/esm/protocol/jid.js +133 -52
  147. package/dist/esm/protocol/media.js +3 -3
  148. package/dist/esm/protocol/message.js +61 -1
  149. package/dist/esm/protocol/nodes.js +4 -0
  150. package/dist/esm/protocol/notification.js +3 -1
  151. package/dist/esm/protocol/privacy-token.js +17 -0
  152. package/dist/esm/protocol/privacy.js +55 -0
  153. package/dist/esm/protocol/stream.js +26 -1
  154. package/dist/esm/protocol/usync.js +11 -0
  155. package/dist/esm/retry/codec.js +216 -0
  156. package/dist/esm/retry/constants.js +1 -1
  157. package/dist/esm/retry/index.js +3 -2
  158. package/dist/esm/retry/parse.js +88 -86
  159. package/dist/esm/retry/replay.js +54 -51
  160. package/dist/esm/retry/tracker.js +94 -0
  161. package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
  162. package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
  163. package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
  164. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
  165. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  166. package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
  167. package/dist/esm/signal/api/result-map.js +10 -0
  168. package/dist/esm/signal/constants.js +0 -4
  169. package/dist/esm/signal/crypto/WaAdvSignature.js +13 -9
  170. package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
  171. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  172. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  173. package/dist/esm/signal/group/SenderKeyManager.js +144 -115
  174. package/dist/esm/signal/index.js +2 -0
  175. package/dist/esm/signal/registration/keygen.js +6 -2
  176. package/dist/esm/signal/registration/utils.js +1 -0
  177. package/dist/esm/signal/session/SignalProtocol.js +164 -53
  178. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  179. package/dist/esm/signal/session/SignalSession.js +14 -9
  180. package/dist/esm/signal/session/resolver.js +221 -0
  181. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  182. package/dist/esm/store/createStore.js +100 -188
  183. package/dist/esm/store/index.js +1 -10
  184. package/dist/esm/store/locks/appstate.lock.js +26 -0
  185. package/dist/esm/store/locks/auth.lock.js +15 -0
  186. package/dist/esm/store/locks/contact.lock.js +20 -0
  187. package/dist/esm/store/locks/device-list.lock.js +20 -0
  188. package/dist/esm/store/locks/message.lock.js +21 -0
  189. package/dist/esm/store/locks/participants.lock.js +20 -0
  190. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  191. package/dist/esm/store/locks/retry.lock.js +29 -0
  192. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  193. package/dist/esm/store/locks/signal.lock.js +63 -0
  194. package/dist/esm/store/locks/thread.lock.js +21 -0
  195. package/dist/esm/store/noop.store.js +4 -7
  196. package/dist/esm/store/providers/memory/appstate.store.js +38 -16
  197. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  198. package/dist/esm/store/providers/memory/device-list.store.js +12 -34
  199. package/dist/esm/store/providers/memory/message.store.js +11 -5
  200. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  201. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  202. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  203. package/dist/esm/store/providers/memory/sender-key.store.js +11 -8
  204. package/dist/esm/store/providers/memory/signal.store.js +47 -18
  205. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  206. package/dist/esm/transport/WaComms.js +28 -24
  207. package/dist/esm/transport/WaWebSocket.js +115 -18
  208. package/dist/esm/transport/binary/constants.js +0 -30
  209. package/dist/esm/transport/binary/decoder.js +8 -8
  210. package/dist/esm/transport/binary/encoder.js +10 -9
  211. package/dist/esm/transport/binary/index.js +0 -1
  212. package/dist/esm/transport/index.js +1 -0
  213. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  214. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
  215. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  216. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  217. package/dist/esm/transport/node/builders/business.js +129 -0
  218. package/dist/esm/transport/node/builders/global.js +370 -0
  219. package/dist/esm/transport/node/builders/index.js +7 -3
  220. package/dist/esm/transport/node/builders/message.js +63 -230
  221. package/dist/esm/transport/node/builders/pairing.js +2 -27
  222. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  223. package/dist/esm/transport/node/builders/privacy.js +48 -0
  224. package/dist/esm/transport/node/builders/profile.js +70 -0
  225. package/dist/esm/transport/node/builders/retry.js +10 -22
  226. package/dist/esm/transport/node/builders/usync.js +45 -0
  227. package/dist/esm/transport/node/helpers.js +125 -5
  228. package/dist/esm/transport/node/usync.js +5 -0
  229. package/dist/esm/transport/node/xml.js +35 -14
  230. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  231. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  232. package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
  233. package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
  234. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  235. package/dist/esm/transport/proxy.js +27 -0
  236. package/dist/esm/transport/stream/parse.js +17 -48
  237. package/dist/esm/util/bytes.js +67 -45
  238. package/dist/esm/util/coercion.js +6 -14
  239. package/dist/esm/util/index.js +5 -0
  240. package/dist/esm/util/primitives.js +40 -14
  241. package/dist/index.js +7 -1
  242. package/dist/infra/log/ConsoleLogger.js +18 -17
  243. package/dist/infra/log/PinoLogger.js +15 -9
  244. package/dist/infra/log/types.js +12 -0
  245. package/dist/infra/perf/BackgroundQueue.js +482 -0
  246. package/dist/infra/perf/BoundedTaskQueue.js +16 -18
  247. package/dist/infra/perf/PromiseDedup.js +24 -0
  248. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  249. package/dist/infra/perf/StoreLock.js +81 -0
  250. package/dist/media/WaMediaCrypto.js +95 -15
  251. package/dist/media/WaMediaTransferClient.js +284 -91
  252. package/dist/media/conn.js +10 -6
  253. package/dist/media/constants.js +6 -2
  254. package/dist/message/WaMessageClient.js +31 -33
  255. package/dist/message/ack.js +6 -6
  256. package/dist/message/addon-crypto.js +65 -0
  257. package/dist/message/content.js +198 -9
  258. package/dist/message/icdc.js +81 -0
  259. package/dist/message/incoming.js +127 -120
  260. package/dist/message/index.js +2 -0
  261. package/dist/message/phash.js +3 -1
  262. package/dist/message/reporting-token.js +429 -0
  263. package/dist/message/use-case-secret.js +55 -0
  264. package/dist/protocol/appstate.js +28 -1
  265. package/dist/protocol/browser.js +10 -18
  266. package/dist/protocol/constants.js +26 -1
  267. package/dist/protocol/defaults.js +6 -0
  268. package/dist/protocol/index.js +23 -42
  269. package/dist/protocol/jid.js +140 -52
  270. package/dist/protocol/media.js +3 -3
  271. package/dist/protocol/message.js +62 -2
  272. package/dist/protocol/nodes.js +4 -0
  273. package/dist/protocol/notification.js +3 -1
  274. package/dist/protocol/privacy-token.js +20 -0
  275. package/dist/protocol/privacy.js +58 -0
  276. package/dist/protocol/stream.js +27 -2
  277. package/dist/protocol/usync.js +14 -0
  278. package/dist/retry/codec.js +220 -0
  279. package/dist/retry/constants.js +1 -1
  280. package/dist/retry/index.js +7 -5
  281. package/dist/retry/parse.js +88 -85
  282. package/dist/retry/replay.js +52 -49
  283. package/dist/retry/tracker.js +97 -0
  284. package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
  285. package/dist/signal/api/SignalDigestSyncApi.js +17 -8
  286. package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
  287. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
  288. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  289. package/dist/signal/api/SignalSessionSyncApi.js +36 -34
  290. package/dist/signal/api/result-map.js +13 -0
  291. package/dist/signal/constants.js +1 -5
  292. package/dist/signal/crypto/WaAdvSignature.js +11 -7
  293. package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
  294. package/dist/signal/group/SenderKeyChain.js +27 -22
  295. package/dist/signal/group/SenderKeyCodec.js +5 -6
  296. package/dist/signal/group/SenderKeyManager.js +144 -115
  297. package/dist/signal/index.js +15 -1
  298. package/dist/signal/registration/keygen.js +6 -2
  299. package/dist/signal/registration/utils.js +1 -0
  300. package/dist/signal/session/SignalProtocol.js +164 -53
  301. package/dist/signal/session/SignalRatchet.js +24 -15
  302. package/dist/signal/session/SignalSession.js +14 -9
  303. package/dist/signal/session/resolver.js +224 -0
  304. package/dist/store/contracts/privacy-token.store.js +2 -0
  305. package/dist/store/createStore.js +100 -188
  306. package/dist/store/index.js +15 -33
  307. package/dist/store/locks/appstate.lock.js +29 -0
  308. package/dist/store/locks/auth.lock.js +18 -0
  309. package/dist/store/locks/contact.lock.js +23 -0
  310. package/dist/store/locks/device-list.lock.js +23 -0
  311. package/dist/store/locks/message.lock.js +24 -0
  312. package/dist/store/locks/participants.lock.js +23 -0
  313. package/dist/store/locks/privacy-token.lock.js +21 -0
  314. package/dist/store/locks/retry.lock.js +32 -0
  315. package/dist/store/locks/sender-key.lock.js +55 -0
  316. package/dist/store/locks/signal.lock.js +66 -0
  317. package/dist/store/locks/thread.lock.js +24 -0
  318. package/dist/store/noop.store.js +4 -7
  319. package/dist/store/providers/memory/appstate.store.js +36 -14
  320. package/dist/store/providers/memory/contact.store.js +5 -0
  321. package/dist/store/providers/memory/device-list.store.js +12 -34
  322. package/dist/store/providers/memory/message.store.js +11 -5
  323. package/dist/store/providers/memory/participants.store.js +1 -8
  324. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  325. package/dist/store/providers/memory/retry.store.js +77 -2
  326. package/dist/store/providers/memory/sender-key.store.js +14 -11
  327. package/dist/store/providers/memory/signal.store.js +54 -25
  328. package/dist/store/providers/memory/thread.store.js +5 -0
  329. package/dist/transport/WaComms.js +30 -26
  330. package/dist/transport/WaWebSocket.js +148 -18
  331. package/dist/transport/binary/constants.js +1 -31
  332. package/dist/transport/binary/decoder.js +8 -8
  333. package/dist/transport/binary/encoder.js +10 -9
  334. package/dist/transport/binary/index.js +0 -4
  335. package/dist/transport/index.js +7 -1
  336. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  337. package/dist/transport/node/WaNodeOrchestrator.js +25 -21
  338. package/dist/transport/node/WaNodeTransport.js +0 -3
  339. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  340. package/dist/transport/node/builders/business.js +137 -0
  341. package/dist/transport/node/builders/global.js +375 -0
  342. package/dist/transport/node/builders/index.js +29 -17
  343. package/dist/transport/node/builders/message.js +64 -236
  344. package/dist/transport/node/builders/pairing.js +2 -29
  345. package/dist/transport/node/builders/privacy-token.js +46 -0
  346. package/dist/transport/node/builders/privacy.js +55 -0
  347. package/dist/transport/node/builders/profile.js +78 -0
  348. package/dist/transport/node/builders/retry.js +9 -21
  349. package/dist/transport/node/builders/usync.js +49 -0
  350. package/dist/transport/node/helpers.js +131 -4
  351. package/dist/transport/node/usync.js +8 -0
  352. package/dist/transport/node/xml.js +35 -14
  353. package/dist/transport/noise/WaClientPayload.js +13 -13
  354. package/dist/transport/noise/WaFrameCodec.js +47 -32
  355. package/dist/transport/noise/WaNoiseCert.js +5 -8
  356. package/dist/transport/noise/WaNoiseSession.js +77 -29
  357. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  358. package/dist/transport/proxy.js +34 -0
  359. package/dist/transport/stream/parse.js +20 -52
  360. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  361. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  362. package/dist/types/appstate/constants.d.ts +1 -0
  363. package/dist/types/appstate/encoding.d.ts +7 -0
  364. package/dist/types/appstate/index.d.ts +3 -3
  365. package/dist/types/appstate/utils.d.ts +0 -3
  366. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  367. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  368. package/dist/types/auth/index.d.ts +0 -4
  369. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  370. package/dist/types/auth/types.d.ts +7 -9
  371. package/dist/types/client/WaClient.d.ts +42 -25
  372. package/dist/types/client/WaClientFactory.d.ts +33 -26
  373. package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
  374. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  375. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  376. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  377. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  378. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
  379. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
  380. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  381. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  382. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  383. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +8 -0
  384. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  385. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  386. package/dist/types/client/dirty.d.ts +1 -0
  387. package/dist/types/client/events/devices.d.ts +20 -0
  388. package/dist/types/client/events/group.d.ts +2 -1
  389. package/dist/types/client/events/identity.d.ts +9 -0
  390. package/dist/types/client/events/privacy-token.d.ts +7 -0
  391. package/dist/types/client/history-sync.d.ts +9 -6
  392. package/dist/types/client/incoming.d.ts +3 -1
  393. package/dist/types/client/index.d.ts +1 -1
  394. package/dist/types/client/mailbox.d.ts +3 -5
  395. package/dist/types/client/messages.d.ts +1 -2
  396. package/dist/types/client/messaging/fanout.d.ts +14 -0
  397. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  398. package/dist/types/client/messaging/participants.d.ts +13 -0
  399. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  400. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  401. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  402. package/dist/types/client/types.d.ts +75 -4
  403. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  404. package/dist/types/crypto/core/index.d.ts +2 -3
  405. package/dist/types/crypto/core/nonce.d.ts +2 -0
  406. package/dist/types/crypto/core/primitives.d.ts +0 -1
  407. package/dist/types/crypto/core/random.d.ts +2 -7
  408. package/dist/types/crypto/index.d.ts +0 -1
  409. package/dist/types/crypto/math/constants.d.ts +4 -2
  410. package/dist/types/crypto/math/fe.d.ts +30 -0
  411. package/dist/types/crypto/math/mod.d.ts +0 -2
  412. package/dist/types/crypto/math/types.d.ts +11 -4
  413. package/dist/types/index.d.ts +5 -3
  414. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  415. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  416. package/dist/types/infra/log/types.d.ts +1 -0
  417. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  418. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  419. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  420. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  421. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  422. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  423. package/dist/types/media/WaMediaTransferClient.d.ts +16 -15
  424. package/dist/types/media/constants.d.ts +1 -1
  425. package/dist/types/media/index.d.ts +1 -1
  426. package/dist/types/media/types.d.ts +15 -2
  427. package/dist/types/message/addon-crypto.d.ts +25 -0
  428. package/dist/types/message/content.d.ts +8 -0
  429. package/dist/types/message/icdc.d.ts +13 -0
  430. package/dist/types/message/index.d.ts +2 -0
  431. package/dist/types/message/reporting-token.d.ts +18 -0
  432. package/dist/types/message/types.d.ts +45 -6
  433. package/dist/types/message/use-case-secret.d.ts +20 -0
  434. package/dist/types/protocol/appstate.d.ts +47 -0
  435. package/dist/types/protocol/constants.d.ts +8 -3
  436. package/dist/types/protocol/defaults.d.ts +6 -0
  437. package/dist/types/protocol/index.d.ts +2 -11
  438. package/dist/types/protocol/jid.d.ts +22 -5
  439. package/dist/types/protocol/message.d.ts +60 -0
  440. package/dist/types/protocol/nodes.d.ts +4 -0
  441. package/dist/types/protocol/notification.d.ts +2 -0
  442. package/dist/types/protocol/privacy-token.d.ts +17 -0
  443. package/dist/types/protocol/privacy.d.ts +75 -0
  444. package/dist/types/protocol/stream.d.ts +30 -0
  445. package/dist/types/protocol/usync.d.ts +11 -0
  446. package/dist/types/retry/codec.d.ts +3 -0
  447. package/dist/types/retry/index.d.ts +4 -3
  448. package/dist/types/retry/parse.d.ts +5 -2
  449. package/dist/types/retry/replay.d.ts +0 -4
  450. package/dist/types/retry/tracker.d.ts +20 -0
  451. package/dist/types/retry/types.d.ts +10 -4
  452. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
  453. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  454. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  455. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  456. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  457. package/dist/types/signal/api/result-map.d.ts +1 -0
  458. package/dist/types/signal/constants.d.ts +0 -3
  459. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  460. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  461. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  462. package/dist/types/signal/index.d.ts +3 -0
  463. package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
  464. package/dist/types/signal/session/resolver.d.ts +22 -0
  465. package/dist/types/store/contracts/appstate.store.d.ts +4 -1
  466. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  467. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  468. package/dist/types/store/contracts/message.store.d.ts +1 -0
  469. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  470. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  471. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  472. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  473. package/dist/types/store/contracts/signal.store.d.ts +13 -0
  474. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  475. package/dist/types/store/createStore.d.ts +1 -1
  476. package/dist/types/store/index.d.ts +5 -13
  477. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  478. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  479. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  480. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  481. package/dist/types/store/locks/message.lock.d.ts +3 -0
  482. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  483. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  484. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  485. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  486. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  487. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  488. package/dist/types/store/providers/memory/appstate.store.d.ts +3 -1
  489. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  490. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  491. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  492. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  493. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  494. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  495. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  496. package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
  497. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  498. package/dist/types/store/types.d.ts +49 -58
  499. package/dist/types/transport/WaWebSocket.d.ts +3 -1
  500. package/dist/types/transport/binary/constants.d.ts +0 -30
  501. package/dist/types/transport/binary/index.d.ts +0 -1
  502. package/dist/types/transport/index.d.ts +2 -1
  503. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  504. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  505. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  506. package/dist/types/transport/node/builders/business.d.ts +29 -0
  507. package/dist/types/transport/node/builders/global.d.ts +102 -0
  508. package/dist/types/transport/node/builders/group.d.ts +4 -6
  509. package/dist/types/transport/node/builders/index.d.ts +7 -3
  510. package/dist/types/transport/node/builders/message.d.ts +20 -30
  511. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  512. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  513. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  514. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  515. package/dist/types/transport/node/builders/retry.d.ts +2 -5
  516. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  517. package/dist/types/transport/node/helpers.d.ts +13 -0
  518. package/dist/types/transport/node/usync.d.ts +2 -0
  519. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  520. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  521. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  522. package/dist/types/transport/proxy.d.ts +6 -0
  523. package/dist/types/transport/stream/parse.d.ts +0 -1
  524. package/dist/types/transport/types.d.ts +18 -1
  525. package/dist/types/util/bytes.d.ts +5 -0
  526. package/dist/types/util/index.d.ts +5 -0
  527. package/dist/types/util/primitives.d.ts +2 -0
  528. package/dist/util/bytes.js +72 -46
  529. package/dist/util/coercion.js +6 -14
  530. package/dist/util/index.js +23 -0
  531. package/dist/util/primitives.js +42 -14
  532. package/package.json +52 -9
  533. package/proto/index.js +1 -1
  534. package/dist/crypto/core/constants.js +0 -4
  535. package/dist/crypto/core/encoding.js +0 -29
  536. package/dist/esm/crypto/core/constants.js +0 -1
  537. package/dist/esm/crypto/core/encoding.js +0 -25
  538. package/dist/esm/retry/outbound.js +0 -83
  539. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  540. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
  541. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  542. package/dist/esm/store/providers/sqlite/connection.js +0 -240
  543. package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
  544. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
  545. package/dist/esm/store/providers/sqlite/message.store.js +0 -119
  546. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  547. package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
  548. package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
  549. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
  550. package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
  551. package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
  552. package/dist/esm/util/base64.js +0 -18
  553. package/dist/esm/util/signal-address.js +0 -5
  554. package/dist/retry/outbound.js +0 -88
  555. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  556. package/dist/store/providers/sqlite/appstate.store.js +0 -173
  557. package/dist/store/providers/sqlite/auth.store.js +0 -180
  558. package/dist/store/providers/sqlite/connection.js +0 -276
  559. package/dist/store/providers/sqlite/contact.store.js +0 -65
  560. package/dist/store/providers/sqlite/device-list.store.js +0 -159
  561. package/dist/store/providers/sqlite/message.store.js +0 -123
  562. package/dist/store/providers/sqlite/migrations.js +0 -350
  563. package/dist/store/providers/sqlite/participants.store.js +0 -89
  564. package/dist/store/providers/sqlite/retry.store.js +0 -148
  565. package/dist/store/providers/sqlite/sender-key.store.js +0 -207
  566. package/dist/store/providers/sqlite/signal.store.js +0 -357
  567. package/dist/store/providers/sqlite/thread.store.js +0 -76
  568. package/dist/types/appstate/store/sqlite.d.ts +0 -21
  569. package/dist/types/crypto/core/constants.d.ts +0 -1
  570. package/dist/types/crypto/core/encoding.d.ts +0 -11
  571. package/dist/types/retry/outbound.d.ts +0 -4
  572. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  573. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -15
  574. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  575. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  576. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -10
  577. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
  578. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
  579. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  580. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
  581. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
  582. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
  583. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
  584. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
  585. package/dist/types/util/base64.d.ts +0 -4
  586. package/dist/types/util/signal-address.d.ts +0 -2
  587. package/dist/util/base64.js +0 -24
  588. package/dist/util/signal-address.js +0 -8
  589. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -0,0 +1,59 @@
1
+ import { aesGcmDecrypt, aesGcmEncrypt, importAesGcmKey } from '../crypto/index.js';
2
+ import { assertMessageSecret, createUseCaseSecret, WA_USE_CASE_SECRET_MODIFICATION_TYPES } from './use-case-secret.js';
3
+ import { EMPTY_BYTES, TEXT_ENCODER, toBytesView } from '../util/bytes.js';
4
+ const WA_ADDON_ENCRYPTION_NONCE_BYTES = 12;
5
+ export function shouldUseAddonAdditionalData(modificationType) {
6
+ return (modificationType === WA_USE_CASE_SECRET_MODIFICATION_TYPES.POLL_VOTE ||
7
+ modificationType === WA_USE_CASE_SECRET_MODIFICATION_TYPES.EVENT_RESPONSE);
8
+ }
9
+ export function buildAddonAdditionalData(stanzaId, addOnSenderJid) {
10
+ if (!stanzaId.trim()) {
11
+ throw new Error('stanza id must be a non-empty string');
12
+ }
13
+ if (!addOnSenderJid.trim()) {
14
+ throw new Error('addon sender jid must be a non-empty string');
15
+ }
16
+ return TEXT_ENCODER.encode(`${stanzaId}\u0000${addOnSenderJid}`);
17
+ }
18
+ export async function encryptAddonPayload(input) {
19
+ const secret = await createUseCaseSecret({
20
+ messageSecret: assertMessageSecret(input.messageSecret),
21
+ stanzaId: input.stanzaId,
22
+ parentMsgOriginalSender: input.parentMsgOriginalSender,
23
+ modificationSender: input.modificationSender,
24
+ modificationType: input.modificationType
25
+ });
26
+ const key = await importAesGcmKey(secret, ['encrypt']);
27
+ const iv = assertAddonIv(input.iv);
28
+ const additionalData = resolveAddonAdditionalData(input);
29
+ return aesGcmEncrypt(key, iv, toBytesView(input.payload), additionalData);
30
+ }
31
+ export async function decryptAddonPayload(input) {
32
+ const secret = await createUseCaseSecret({
33
+ messageSecret: assertMessageSecret(input.messageSecret),
34
+ stanzaId: input.stanzaId,
35
+ parentMsgOriginalSender: input.parentMsgOriginalSender,
36
+ modificationSender: input.modificationSender,
37
+ modificationType: input.modificationType
38
+ });
39
+ const key = await importAesGcmKey(secret, ['decrypt']);
40
+ const iv = assertAddonIv(input.iv);
41
+ const additionalData = resolveAddonAdditionalData(input);
42
+ return aesGcmDecrypt(key, iv, toBytesView(input.ciphertext), additionalData);
43
+ }
44
+ function assertAddonIv(iv) {
45
+ const normalized = toBytesView(iv);
46
+ if (normalized.byteLength !== WA_ADDON_ENCRYPTION_NONCE_BYTES) {
47
+ throw new Error(`addon iv must be ${WA_ADDON_ENCRYPTION_NONCE_BYTES} bytes (got ${normalized.byteLength})`);
48
+ }
49
+ return normalized;
50
+ }
51
+ function resolveAddonAdditionalData(input) {
52
+ if (input.additionalData) {
53
+ return toBytesView(input.additionalData);
54
+ }
55
+ if (!shouldUseAddonAdditionalData(input.modificationType)) {
56
+ return EMPTY_BYTES;
57
+ }
58
+ return buildAddonAdditionalData(input.stanzaId, input.modificationSender);
59
+ }
@@ -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
  }
@@ -0,0 +1,76 @@
1
+ import { sha256, toRawPubKey } from '../crypto/index.js';
2
+ import { parseSignalAddressFromJid } from '../protocol/jid.js';
3
+ import { concatBytes } from '../util/bytes.js';
4
+ const ICDC_HASH_LENGTH = 8;
5
+ const ICDC_FRESHNESS_THRESHOLD_MS = 30 * 24 * 60 * 60 * 1000;
6
+ const DEVICE_LIST_METADATA_VERSION = 2;
7
+ const EMPTY_KEY_HASH = new Uint8Array(ICDC_HASH_LENGTH);
8
+ export async function computeDeviceKeyHash(identityKeys) {
9
+ if (identityKeys.length === 0) {
10
+ return EMPTY_KEY_HASH;
11
+ }
12
+ const rawKeys = new Array(identityKeys.length);
13
+ for (let i = 0; i < identityKeys.length; i += 1) {
14
+ rawKeys[i] =
15
+ identityKeys[i].byteLength === 33 ? toRawPubKey(identityKeys[i]) : identityKeys[i];
16
+ }
17
+ const combined = concatBytes(rawKeys);
18
+ const hash = await sha256(combined);
19
+ return hash.subarray(0, ICDC_HASH_LENGTH);
20
+ }
21
+ export async function resolveIcdcMeta(deviceJids, signalStore, updatedAtMs, localIdentity) {
22
+ if (deviceJids.length === 0) {
23
+ return null;
24
+ }
25
+ const addresses = new Array(deviceJids.length);
26
+ for (let i = 0; i < deviceJids.length; i += 1) {
27
+ addresses[i] = parseSignalAddressFromJid(deviceJids[i]);
28
+ }
29
+ const remoteKeys = await signalStore.getRemoteIdentities(addresses);
30
+ const keys = [];
31
+ for (let i = 0; i < addresses.length; i += 1) {
32
+ const key = remoteKeys[i];
33
+ if (key) {
34
+ keys.push(key);
35
+ }
36
+ else if (localIdentity &&
37
+ addresses[i].user === localIdentity.address.user &&
38
+ addresses[i].device === localIdentity.address.device) {
39
+ keys.push(localIdentity.pubKey);
40
+ }
41
+ }
42
+ if (keys.length === 0) {
43
+ return null;
44
+ }
45
+ const keyHash = await computeDeviceKeyHash(keys);
46
+ const timestamp = updatedAtMs !== undefined && Date.now() - updatedAtMs < ICDC_FRESHNESS_THRESHOLD_MS
47
+ ? Math.floor(updatedAtMs / 1000)
48
+ : undefined;
49
+ return { keyHash, timestamp };
50
+ }
51
+ export function injectDeviceListMetadata(message, senderIcdc, recipientIcdc) {
52
+ if (!senderIcdc && !recipientIcdc) {
53
+ return message;
54
+ }
55
+ const deviceListMetadata = {};
56
+ if (senderIcdc) {
57
+ deviceListMetadata.senderKeyHash = senderIcdc.keyHash;
58
+ if (senderIcdc.timestamp !== undefined) {
59
+ deviceListMetadata.senderTimestamp = senderIcdc.timestamp;
60
+ }
61
+ }
62
+ if (recipientIcdc) {
63
+ deviceListMetadata.recipientKeyHash = recipientIcdc.keyHash;
64
+ if (recipientIcdc.timestamp !== undefined) {
65
+ deviceListMetadata.recipientTimestamp = recipientIcdc.timestamp;
66
+ }
67
+ }
68
+ return {
69
+ ...message,
70
+ messageContextInfo: {
71
+ ...message.messageContextInfo,
72
+ deviceListMetadata,
73
+ deviceListMetadataVersion: DEVICE_LIST_METADATA_VERSION
74
+ }
75
+ };
76
+ }
@@ -3,33 +3,13 @@ import { unpadPkcs7 } from './padding.js';
3
3
  import { proto } from '../proto.js';
4
4
  import { WA_MESSAGE_TAGS, WA_MESSAGE_TYPES } from '../protocol/constants.js';
5
5
  import { isBroadcastJid, isGroupJid, parseSignalAddressFromJid } from '../protocol/jid.js';
6
- import { buildInboundDeliveryReceiptNode, buildInboundMessageAckNode, buildInboundRetryReceiptNode } from '../transport/node/builders/message.js';
7
- import { decodeNodeContentBase64OrBytes, findNodeChild, getNodeChildrenByTag } from '../transport/node/helpers.js';
8
- import { toError } from '../util/primitives.js';
9
- function pickMessageSenderJid(node) {
10
- return node.attrs.participant ?? node.attrs.from;
11
- }
12
- function pickMessageChatJid(node) {
13
- return node.attrs.from;
14
- }
15
- function parseMessageTimestamp(value) {
16
- if (!value) {
17
- return undefined;
18
- }
19
- const parsed = Number.parseInt(value, 10);
20
- if (!Number.isSafeInteger(parsed)) {
21
- return undefined;
22
- }
23
- return parsed;
24
- }
6
+ import { buildAckNode, buildReceiptNode } from '../transport/node/builders/global.js';
7
+ import { decodeNodeContentBase64OrBytes, findNodeChild } from '../transport/node/helpers.js';
8
+ import { parseOptionalInt, toError } from '../util/primitives.js';
25
9
  function pickNextRetryCount(node) {
26
10
  const retryNode = findNodeChild(node, 'retry');
27
- const countRaw = retryNode?.attrs.count;
28
- if (!countRaw) {
29
- return 1;
30
- }
31
- const parsed = Number.parseInt(countRaw, 10);
32
- if (!Number.isSafeInteger(parsed) || parsed < 1) {
11
+ const parsed = parseOptionalInt(retryNode?.attrs.count);
12
+ if (!parsed || parsed < 1) {
33
13
  return 1;
34
14
  }
35
15
  return parsed + 1;
@@ -39,21 +19,26 @@ function buildIncomingEventRawNode(node) {
39
19
  if (!Array.isArray(nodeContent) || nodeContent.length === 0) {
40
20
  return node;
41
21
  }
42
- let redacted = false;
43
- const children = nodeContent.map((child) => {
44
- if (child.tag !== WA_MESSAGE_TAGS.ENC) {
45
- return child;
22
+ let children = null;
23
+ for (let index = 0; index < nodeContent.length; index += 1) {
24
+ const child = nodeContent[index];
25
+ const shouldRedact = child.tag === WA_MESSAGE_TAGS.ENC &&
26
+ (typeof child.content === 'string' || child.content instanceof Uint8Array);
27
+ if (!shouldRedact) {
28
+ if (children) {
29
+ children.push(child);
30
+ }
31
+ continue;
46
32
  }
47
- if (typeof child.content === 'string' || child.content instanceof Uint8Array) {
48
- redacted = true;
49
- return {
50
- tag: child.tag,
51
- attrs: child.attrs
52
- };
33
+ if (!children) {
34
+ children = nodeContent.slice(0, index);
53
35
  }
54
- return child;
55
- });
56
- if (!redacted) {
36
+ children.push({
37
+ tag: child.tag,
38
+ attrs: child.attrs
39
+ });
40
+ }
41
+ if (!children) {
57
42
  return node;
58
43
  }
59
44
  // Strip heavy encrypted payload from event snapshots to reduce retention.
@@ -105,46 +90,21 @@ function shouldEmitIncomingMessage(message) {
105
90
  if (!pickDirectSenderKeyDistributionPayload(message)) {
106
91
  return true;
107
92
  }
108
- for (const [field, value] of Object.entries(message)) {
109
- if (value === null || value === undefined) {
110
- continue;
111
- }
93
+ const messageRecord = message;
94
+ for (const field in messageRecord) {
112
95
  if (field === 'senderKeyDistributionMessage' ||
113
96
  field === 'fastRatchetKeySenderKeyDistributionMessage' ||
114
97
  field === '$$unknownFieldCount') {
115
98
  continue;
116
99
  }
100
+ const value = messageRecord[field];
101
+ if (value === null || value === undefined) {
102
+ continue;
103
+ }
117
104
  return true;
118
105
  }
119
106
  return false;
120
107
  }
121
- async function maybeProcessSenderKeyDistributionMessage(senderJid, message, options, node) {
122
- if (!senderJid || !options.senderKeyManager) {
123
- return;
124
- }
125
- const senderKeyDistribution = pickSenderKeyDistributionPayload(message);
126
- if (!senderKeyDistribution) {
127
- return;
128
- }
129
- try {
130
- await options.senderKeyManager.processSenderKeyDistributionPayload(senderKeyDistribution.groupId, parseSignalAddressFromJid(senderJid), senderKeyDistribution.payload);
131
- options.logger.debug('processed incoming sender key distribution', {
132
- id: node.attrs.id,
133
- from: node.attrs.from,
134
- participant: node.attrs.participant,
135
- groupId: senderKeyDistribution.groupId
136
- });
137
- }
138
- catch (error) {
139
- options.logger.warn('failed to process incoming sender key distribution', {
140
- id: node.attrs.id,
141
- from: node.attrs.from,
142
- participant: node.attrs.participant,
143
- groupId: senderKeyDistribution.groupId,
144
- message: toError(error).message
145
- });
146
- }
147
- }
148
108
  async function sendRetryReceiptForDecryptFailure(node, options, error, encType) {
149
109
  const stanzaId = node.attrs.id;
150
110
  const from = node.attrs.from;
@@ -162,7 +122,13 @@ async function sendRetryReceiptForDecryptFailure(node, options, error, encType)
162
122
  if (options.onDecryptFailure) {
163
123
  return options.onDecryptFailure(retryContext, error);
164
124
  }
165
- const retryReceiptNode = buildInboundRetryReceiptNode(node, stanzaId, from, options.getMeJid?.(), pickNextRetryCount(node));
125
+ const retryReceiptNode = buildReceiptNode({
126
+ kind: 'retry',
127
+ node,
128
+ id: stanzaId,
129
+ to: from,
130
+ retryCount: pickNextRetryCount(node)
131
+ });
166
132
  try {
167
133
  await options.sendNode(retryReceiptNode);
168
134
  options.logger.debug('sent retry receipt for undecryptable incoming message', {
@@ -186,15 +152,37 @@ async function sendRetryReceiptForDecryptFailure(node, options, error, encType)
186
152
  }
187
153
  async function decryptAndProcessEncNode(node, encNode, encType, senderJid, options, decrypt) {
188
154
  try {
189
- const decryptedPayload = await decrypt(decodeNodeContentBase64OrBytes(encNode.content, 'message.enc'));
155
+ const senderAddress = parseSignalAddressFromJid(senderJid);
156
+ const decryptedPayload = await decrypt(decodeNodeContentBase64OrBytes(encNode.content, 'message.enc'), senderAddress);
190
157
  const unpaddedPlaintext = unpadPkcs7(decryptedPayload);
191
- const message = normalizeIncomingDecryptedMessage(proto.Message.decode(unpaddedPlaintext));
192
- await maybeProcessSenderKeyDistributionMessage(senderJid, message, options, node);
158
+ const decodedMessage = proto.Message.decode(unpaddedPlaintext);
159
+ const message = unwrapDeviceSentMessage(decodedMessage) ?? decodedMessage;
160
+ const senderKeyDistribution = pickSenderKeyDistributionPayload(message);
161
+ if (senderKeyDistribution && options.senderKeyManager) {
162
+ try {
163
+ await options.senderKeyManager.processSenderKeyDistributionPayload(senderKeyDistribution.groupId, senderAddress, senderKeyDistribution.payload);
164
+ options.logger.debug('processed incoming sender key distribution', {
165
+ id: node.attrs.id,
166
+ from: node.attrs.from,
167
+ participant: node.attrs.participant,
168
+ groupId: senderKeyDistribution.groupId
169
+ });
170
+ }
171
+ catch (error) {
172
+ options.logger.warn('failed to process incoming sender key distribution', {
173
+ id: node.attrs.id,
174
+ from: node.attrs.from,
175
+ participant: node.attrs.participant,
176
+ groupId: senderKeyDistribution.groupId,
177
+ message: toError(error).message
178
+ });
179
+ }
180
+ }
193
181
  if (shouldEmitIncomingMessage(message)) {
194
- const chatJid = pickMessageChatJid(node);
182
+ const chatJid = node.attrs.from;
195
183
  options.emitIncomingMessage?.({
196
184
  ...buildBaseIncomingEvent(node),
197
- timestampSeconds: parseMessageTimestamp(node.attrs.t),
185
+ timestampSeconds: parseOptionalInt(node.attrs.t),
198
186
  senderJid,
199
187
  encryptionType: encType,
200
188
  isGroupChat: chatJid ? isGroupJid(chatJid) : false,
@@ -225,57 +213,68 @@ export async function handleIncomingMessageAck(node, options) {
225
213
  return false;
226
214
  }
227
215
  let shouldSendStandardReceipt = true;
228
- const encNodes = getNodeChildrenByTag(node, WA_MESSAGE_TAGS.ENC);
229
- if (encNodes.length > 1 && encNodes[0]?.attrs.type === 'skmsg') {
230
- options.logger.warn('incoming message enc order is unexpected: skmsg first', {
231
- id: node.attrs.id,
232
- from: node.attrs.from,
233
- participant: node.attrs.participant,
234
- encCount: encNodes.length
235
- });
236
- }
237
- if (encNodes.length > 0) {
238
- const senderJid = pickMessageSenderJid(node);
239
- const chatJid = pickMessageChatJid(node);
216
+ const nodeContent = node.content;
217
+ if (Array.isArray(nodeContent) && nodeContent.length > 0) {
218
+ const senderJid = node.attrs.participant ?? node.attrs.from;
240
219
  let hasSuccessfulDecrypt = false;
241
220
  let firstDecryptFailure = null;
242
- for (const encNode of encNodes) {
243
- const encType = encNode.attrs.type;
244
- if (!encType) {
221
+ let encCount = 0;
222
+ let firstEncType;
223
+ for (const child of nodeContent) {
224
+ if (child.tag !== WA_MESSAGE_TAGS.ENC) {
245
225
  continue;
246
226
  }
247
- if (encType === 'skmsg') {
248
- if (!senderJid || !chatJid || !options.senderKeyManager) {
249
- options.emitUnhandledStanza?.({
250
- ...buildBaseIncomingEvent(node),
251
- reason: 'message.skmsg.missing_group_context'
252
- });
253
- continue;
254
- }
255
- const result = await decryptAndProcessEncNode(node, encNode, encType, senderJid, options, (ciphertext) => options.senderKeyManager.decryptGroupMessage({
256
- groupId: chatJid,
257
- sender: parseSignalAddressFromJid(senderJid),
258
- ciphertext
259
- }));
260
- if (result.success) {
261
- hasSuccessfulDecrypt = true;
262
- }
263
- else if (!firstDecryptFailure) {
264
- firstDecryptFailure = result;
265
- }
266
- continue;
227
+ encCount += 1;
228
+ if (firstEncType === undefined) {
229
+ firstEncType = child.attrs.type;
267
230
  }
268
- if ((encType === 'msg' || encType === 'pkmsg') && senderJid && options.signalProtocol) {
269
- const result = await decryptAndProcessEncNode(node, encNode, encType, senderJid, options, (ciphertext) => options.signalProtocol.decryptMessage(parseSignalAddressFromJid(senderJid), { type: encType, ciphertext }));
270
- if (result.success) {
271
- hasSuccessfulDecrypt = true;
231
+ let result = null;
232
+ switch (child.attrs.type) {
233
+ case 'skmsg': {
234
+ if (!senderJid || !node.attrs.from || !options.senderKeyManager) {
235
+ options.emitUnhandledStanza?.({
236
+ ...buildBaseIncomingEvent(node),
237
+ reason: 'message.skmsg.missing_group_context'
238
+ });
239
+ continue;
240
+ }
241
+ const groupId = node.attrs.from;
242
+ result = await decryptAndProcessEncNode(node, child, 'skmsg', senderJid, options, (ciphertext, senderAddress) => options.senderKeyManager.decryptGroupMessage({
243
+ groupId,
244
+ sender: senderAddress,
245
+ ciphertext
246
+ }));
247
+ break;
272
248
  }
273
- else if (!firstDecryptFailure) {
274
- firstDecryptFailure = result;
249
+ case 'msg':
250
+ case 'pkmsg': {
251
+ if (!senderJid || !options.signalProtocol) {
252
+ continue;
253
+ }
254
+ const encType = child.attrs.type === 'msg' ? 'msg' : 'pkmsg';
255
+ result = await decryptAndProcessEncNode(node, child, encType, senderJid, options, (ciphertext, senderAddress) => options.signalProtocol.decryptMessage(senderAddress, {
256
+ type: encType,
257
+ ciphertext
258
+ }));
259
+ break;
275
260
  }
261
+ default:
262
+ continue;
276
263
  }
264
+ if (result.success)
265
+ hasSuccessfulDecrypt = true;
266
+ else if (!firstDecryptFailure)
267
+ firstDecryptFailure = result;
277
268
  }
278
- if (!hasSuccessfulDecrypt && firstDecryptFailure) {
269
+ if (encCount > 1 && firstEncType === 'skmsg') {
270
+ options.logger.warn('incoming message enc order is unexpected: skmsg first', {
271
+ id: node.attrs.id,
272
+ from: node.attrs.from,
273
+ participant: node.attrs.participant,
274
+ encCount
275
+ });
276
+ }
277
+ if (encCount > 0 && !hasSuccessfulDecrypt && firstDecryptFailure) {
279
278
  shouldSendStandardReceipt = !(await sendRetryReceiptForDecryptFailure(node, options, firstDecryptFailure.error, firstDecryptFailure.encType));
280
279
  }
281
280
  }
@@ -290,7 +289,13 @@ export async function handleIncomingMessageAck(node, options) {
290
289
  return true;
291
290
  }
292
291
  if (node.attrs.type === WA_MESSAGE_TYPES.MEDIA_NOTIFY) {
293
- const ackNode = buildInboundMessageAckNode(node, id, from, options.getMeJid?.());
292
+ const ackNode = buildAckNode({
293
+ kind: 'message',
294
+ node,
295
+ id,
296
+ to: from,
297
+ from: options.getMeJid?.()
298
+ });
294
299
  options.logger.debug('sending inbound message ack', {
295
300
  id,
296
301
  to: from,
@@ -303,7 +308,12 @@ export async function handleIncomingMessageAck(node, options) {
303
308
  if (!shouldSendStandardReceipt) {
304
309
  return true;
305
310
  }
306
- const receiptNode = buildInboundDeliveryReceiptNode(node, id, from);
311
+ const receiptNode = buildReceiptNode({
312
+ kind: 'delivery',
313
+ node,
314
+ id,
315
+ to: from
316
+ });
307
317
  options.logger.debug('sending inbound message receipt', {
308
318
  id,
309
319
  to: from,
@@ -313,6 +323,3 @@ export async function handleIncomingMessageAck(node, options) {
313
323
  await options.sendNode(receiptNode);
314
324
  return true;
315
325
  }
316
- function normalizeIncomingDecryptedMessage(message) {
317
- return unwrapDeviceSentMessage(message) ?? message;
318
- }