zapo-js 0.1.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 (585) hide show
  1. package/README.md +235 -0
  2. package/dist/appstate/WaAppStateCrypto.js +202 -0
  3. package/dist/appstate/WaAppStateSyncClient.js +808 -0
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +71 -0
  5. package/dist/appstate/constants.js +23 -0
  6. package/dist/appstate/index.js +28 -0
  7. package/dist/appstate/store/sqlite.js +55 -0
  8. package/dist/appstate/types.js +2 -0
  9. package/dist/appstate/utils.js +84 -0
  10. package/dist/auth/WaAuthClient.js +266 -0
  11. package/dist/auth/flow/WaAuthCredentialsFlow.js +123 -0
  12. package/dist/auth/index.js +27 -0
  13. package/dist/auth/pairing/WaPairingCodeCrypto.js +75 -0
  14. package/dist/auth/pairing/WaPairingFlow.js +328 -0
  15. package/dist/auth/pairing/WaQrFlow.js +86 -0
  16. package/dist/auth/pairing/constants.js +5 -0
  17. package/dist/auth/types.js +2 -0
  18. package/dist/client/WaClient.js +749 -0
  19. package/dist/client/WaClientFactory.js +381 -0
  20. package/dist/client/coordinators/WaGroupCoordinator.js +191 -0
  21. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +315 -0
  22. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +1061 -0
  23. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +200 -0
  24. package/dist/client/coordinators/WaRetryCoordinator.js +494 -0
  25. package/dist/client/coordinators/WaStreamControlCoordinator.js +123 -0
  26. package/dist/client/dirty.js +254 -0
  27. package/dist/client/events/chat.js +226 -0
  28. package/dist/client/events/group.js +410 -0
  29. package/dist/client/history-sync.js +122 -0
  30. package/dist/client/incoming.js +236 -0
  31. package/dist/client/index.js +5 -0
  32. package/dist/client/mailbox.js +49 -0
  33. package/dist/client/messages.js +152 -0
  34. package/dist/client/types.js +2 -0
  35. package/dist/crypto/core/constants.js +4 -0
  36. package/dist/crypto/core/encoding.js +29 -0
  37. package/dist/crypto/core/hkdf.js +26 -0
  38. package/dist/crypto/core/index.js +43 -0
  39. package/dist/crypto/core/keys.js +73 -0
  40. package/dist/crypto/core/nonce.js +18 -0
  41. package/dist/crypto/core/primitives.js +121 -0
  42. package/dist/crypto/core/random.js +32 -0
  43. package/dist/crypto/curves/Ed25519.js +42 -0
  44. package/dist/crypto/curves/X25519.js +64 -0
  45. package/dist/crypto/curves/constants.js +6 -0
  46. package/dist/crypto/curves/types.js +9 -0
  47. package/dist/crypto/index.js +22 -0
  48. package/dist/crypto/math/constants.js +44 -0
  49. package/dist/crypto/math/edwards.js +64 -0
  50. package/dist/crypto/math/le.js +20 -0
  51. package/dist/crypto/math/mod.js +38 -0
  52. package/dist/crypto/math/types.js +2 -0
  53. package/dist/esm/appstate/WaAppStateCrypto.js +198 -0
  54. package/dist/esm/appstate/WaAppStateSyncClient.js +803 -0
  55. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +67 -0
  56. package/dist/esm/appstate/constants.js +20 -0
  57. package/dist/esm/appstate/index.js +6 -0
  58. package/dist/esm/appstate/store/sqlite.js +49 -0
  59. package/dist/esm/appstate/types.js +1 -0
  60. package/dist/esm/appstate/utils.js +75 -0
  61. package/dist/esm/auth/WaAuthClient.js +262 -0
  62. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +118 -0
  63. package/dist/esm/auth/index.js +5 -0
  64. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +71 -0
  65. package/dist/esm/auth/pairing/WaPairingFlow.js +324 -0
  66. package/dist/esm/auth/pairing/WaQrFlow.js +82 -0
  67. package/dist/esm/auth/pairing/constants.js +2 -0
  68. package/dist/esm/auth/types.js +1 -0
  69. package/dist/esm/client/WaClient.js +745 -0
  70. package/dist/esm/client/WaClientFactory.js +377 -0
  71. package/dist/esm/client/coordinators/WaGroupCoordinator.js +188 -0
  72. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +311 -0
  73. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +1057 -0
  74. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +196 -0
  75. package/dist/esm/client/coordinators/WaRetryCoordinator.js +490 -0
  76. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +120 -0
  77. package/dist/esm/client/dirty.js +250 -0
  78. package/dist/esm/client/events/chat.js +223 -0
  79. package/dist/esm/client/events/group.js +407 -0
  80. package/dist/esm/client/history-sync.js +119 -0
  81. package/dist/esm/client/incoming.js +227 -0
  82. package/dist/esm/client/index.js +1 -0
  83. package/dist/esm/client/mailbox.js +46 -0
  84. package/dist/esm/client/messages.js +148 -0
  85. package/dist/esm/client/types.js +1 -0
  86. package/dist/esm/crypto/core/constants.js +1 -0
  87. package/dist/esm/crypto/core/encoding.js +25 -0
  88. package/dist/esm/crypto/core/hkdf.js +22 -0
  89. package/dist/esm/crypto/core/index.js +11 -0
  90. package/dist/esm/crypto/core/keys.js +66 -0
  91. package/dist/esm/crypto/core/nonce.js +15 -0
  92. package/dist/esm/crypto/core/primitives.js +102 -0
  93. package/dist/esm/crypto/core/random.js +28 -0
  94. package/dist/esm/crypto/curves/Ed25519.js +38 -0
  95. package/dist/esm/crypto/curves/X25519.js +58 -0
  96. package/dist/esm/crypto/curves/constants.js +3 -0
  97. package/dist/esm/crypto/curves/types.js +6 -0
  98. package/dist/esm/crypto/index.js +3 -0
  99. package/dist/esm/crypto/math/constants.js +41 -0
  100. package/dist/esm/crypto/math/edwards.js +60 -0
  101. package/dist/esm/crypto/math/le.js +16 -0
  102. package/dist/esm/crypto/math/mod.js +31 -0
  103. package/dist/esm/crypto/math/types.js +1 -0
  104. package/dist/esm/index.js +6 -0
  105. package/dist/esm/infra/log/ConsoleLogger.js +40 -0
  106. package/dist/esm/infra/log/PinoLogger.js +73 -0
  107. package/dist/esm/infra/log/types.js +1 -0
  108. package/dist/esm/infra/perf/BoundedTaskQueue.js +62 -0
  109. package/dist/esm/media/WaMediaCrypto.js +224 -0
  110. package/dist/esm/media/WaMediaTransferClient.js +361 -0
  111. package/dist/esm/media/conn.js +33 -0
  112. package/dist/esm/media/constants.js +18 -0
  113. package/dist/esm/media/index.js +3 -0
  114. package/dist/esm/media/types.js +1 -0
  115. package/dist/esm/message/WaMessageClient.js +210 -0
  116. package/dist/esm/message/ack.js +46 -0
  117. package/dist/esm/message/content.js +20 -0
  118. package/dist/esm/message/device-sent.js +49 -0
  119. package/dist/esm/message/incoming.js +318 -0
  120. package/dist/esm/message/index.js +2 -0
  121. package/dist/esm/message/padding.js +20 -0
  122. package/dist/esm/message/phash.js +25 -0
  123. package/dist/esm/message/types.js +1 -0
  124. package/dist/esm/package.json +3 -0
  125. package/dist/esm/proto.js +3 -0
  126. package/dist/esm/protocol/appstate.js +34 -0
  127. package/dist/esm/protocol/auth.js +12 -0
  128. package/dist/esm/protocol/browser.js +41 -0
  129. package/dist/esm/protocol/constants.js +11 -0
  130. package/dist/esm/protocol/defaults.js +27 -0
  131. package/dist/esm/protocol/dirty.js +26 -0
  132. package/dist/esm/protocol/group.js +5 -0
  133. package/dist/esm/protocol/index.js +11 -0
  134. package/dist/esm/protocol/jid.js +94 -0
  135. package/dist/esm/protocol/media.js +20 -0
  136. package/dist/esm/protocol/message.js +16 -0
  137. package/dist/esm/protocol/nodes.js +83 -0
  138. package/dist/esm/protocol/notification.js +50 -0
  139. package/dist/esm/protocol/stream.js +60 -0
  140. package/dist/esm/retry/constants.js +20 -0
  141. package/dist/esm/retry/index.js +5 -0
  142. package/dist/esm/retry/outbound.js +83 -0
  143. package/dist/esm/retry/parse.js +130 -0
  144. package/dist/esm/retry/reason.js +50 -0
  145. package/dist/esm/retry/replay.js +177 -0
  146. package/dist/esm/retry/types.js +1 -0
  147. package/dist/esm/signal/api/SignalDeviceSyncApi.js +185 -0
  148. package/dist/esm/signal/api/SignalDigestSyncApi.js +179 -0
  149. package/dist/esm/signal/api/SignalIdentitySyncApi.js +111 -0
  150. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +141 -0
  151. package/dist/esm/signal/api/SignalRotateKeyApi.js +59 -0
  152. package/dist/esm/signal/api/SignalSessionSyncApi.js +187 -0
  153. package/dist/esm/signal/api/codec.js +23 -0
  154. package/dist/esm/signal/api/constants.js +9 -0
  155. package/dist/esm/signal/api/prekeys.js +9 -0
  156. package/dist/esm/signal/constants.js +16 -0
  157. package/dist/esm/signal/crypto/WaAdvSignature.js +60 -0
  158. package/dist/esm/signal/crypto/constants.js +8 -0
  159. package/dist/esm/signal/group/SenderKeyChain.js +97 -0
  160. package/dist/esm/signal/group/SenderKeyCodec.js +46 -0
  161. package/dist/esm/signal/group/SenderKeyManager.js +176 -0
  162. package/dist/esm/signal/index.js +11 -0
  163. package/dist/esm/signal/registration/keygen.js +31 -0
  164. package/dist/esm/signal/registration/utils.js +16 -0
  165. package/dist/esm/signal/session/SignalProtocol.js +122 -0
  166. package/dist/esm/signal/session/SignalRatchet.js +260 -0
  167. package/dist/esm/signal/session/SignalSerializer.js +63 -0
  168. package/dist/esm/signal/session/SignalSession.js +153 -0
  169. package/dist/esm/signal/store/sqlite.js +310 -0
  170. package/dist/esm/signal/types.js +1 -0
  171. package/dist/esm/store/contracts/appstate.store.js +1 -0
  172. package/dist/esm/store/contracts/auth.store.js +1 -0
  173. package/dist/esm/store/contracts/contact.store.js +1 -0
  174. package/dist/esm/store/contracts/device-list.store.js +1 -0
  175. package/dist/esm/store/contracts/message.store.js +1 -0
  176. package/dist/esm/store/contracts/participants.store.js +1 -0
  177. package/dist/esm/store/contracts/retry.store.js +1 -0
  178. package/dist/esm/store/contracts/sender-key.store.js +1 -0
  179. package/dist/esm/store/contracts/signal.store.js +1 -0
  180. package/dist/esm/store/contracts/thread.store.js +1 -0
  181. package/dist/esm/store/createStore.js +278 -0
  182. package/dist/esm/store/index.js +20 -0
  183. package/dist/esm/store/noop.store.js +43 -0
  184. package/dist/esm/store/providers/memory/appstate.store.js +101 -0
  185. package/dist/esm/store/providers/memory/contact.store.js +23 -0
  186. package/dist/esm/store/providers/memory/device-list.store.js +86 -0
  187. package/dist/esm/store/providers/memory/message.store.js +40 -0
  188. package/dist/esm/store/providers/memory/participants.store.js +61 -0
  189. package/dist/esm/store/providers/memory/retry.store.js +71 -0
  190. package/dist/esm/store/providers/memory/sender-key.store.js +88 -0
  191. package/dist/esm/store/providers/memory/signal.store.js +170 -0
  192. package/dist/esm/store/providers/memory/thread.store.js +34 -0
  193. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +37 -0
  194. package/dist/esm/store/providers/sqlite/appstate.store.js +169 -0
  195. package/dist/esm/store/providers/sqlite/auth.store.js +176 -0
  196. package/dist/esm/store/providers/sqlite/connection.js +240 -0
  197. package/dist/esm/store/providers/sqlite/contact.store.js +61 -0
  198. package/dist/esm/store/providers/sqlite/device-list.store.js +155 -0
  199. package/dist/esm/store/providers/sqlite/message.store.js +119 -0
  200. package/dist/esm/store/providers/sqlite/migrations.js +347 -0
  201. package/dist/esm/store/providers/sqlite/participants.store.js +85 -0
  202. package/dist/esm/store/providers/sqlite/retry.store.js +144 -0
  203. package/dist/esm/store/providers/sqlite/sender-key.store.js +203 -0
  204. package/dist/esm/store/providers/sqlite/signal.store.js +353 -0
  205. package/dist/esm/store/providers/sqlite/thread.store.js +72 -0
  206. package/dist/esm/store/types.js +1 -0
  207. package/dist/esm/transport/WaComms.js +527 -0
  208. package/dist/esm/transport/WaWebSocket.js +361 -0
  209. package/dist/esm/transport/binary/constants.js +96 -0
  210. package/dist/esm/transport/binary/decoder.js +275 -0
  211. package/dist/esm/transport/binary/encoder.js +210 -0
  212. package/dist/esm/transport/binary/index.js +4 -0
  213. package/dist/esm/transport/binary/tokens.js +1280 -0
  214. package/dist/esm/transport/index.js +6 -0
  215. package/dist/esm/transport/keepalive/WaKeepAlive.js +141 -0
  216. package/dist/esm/transport/node/WaNodeOrchestrator.js +143 -0
  217. package/dist/esm/transport/node/WaNodeTransport.js +64 -0
  218. package/dist/esm/transport/node/builders/accountSync.js +101 -0
  219. package/dist/esm/transport/node/builders/group.js +47 -0
  220. package/dist/esm/transport/node/builders/index.js +7 -0
  221. package/dist/esm/transport/node/builders/media.js +10 -0
  222. package/dist/esm/transport/node/builders/message.js +317 -0
  223. package/dist/esm/transport/node/builders/pairing.js +130 -0
  224. package/dist/esm/transport/node/builders/prekeys.js +102 -0
  225. package/dist/esm/transport/node/builders/retry.js +116 -0
  226. package/dist/esm/transport/node/helpers.js +37 -0
  227. package/dist/esm/transport/node/query.js +53 -0
  228. package/dist/esm/transport/node/xml.js +39 -0
  229. package/dist/esm/transport/noise/WaClientPayload.js +162 -0
  230. package/dist/esm/transport/noise/WaFrameCodec.js +121 -0
  231. package/dist/esm/transport/noise/WaNoiseCert.js +74 -0
  232. package/dist/esm/transport/noise/WaNoiseHandshake.js +57 -0
  233. package/dist/esm/transport/noise/WaNoiseSession.js +322 -0
  234. package/dist/esm/transport/noise/WaNoiseSocket.js +17 -0
  235. package/dist/esm/transport/noise/constants.js +8 -0
  236. package/dist/esm/transport/noise/types.js +1 -0
  237. package/dist/esm/transport/stream/parse.js +91 -0
  238. package/dist/esm/transport/types.js +1 -0
  239. package/dist/esm/util/async.js +5 -0
  240. package/dist/esm/util/base64.js +18 -0
  241. package/dist/esm/util/bytes.js +275 -0
  242. package/dist/esm/util/coercion.js +56 -0
  243. package/dist/esm/util/collections.js +27 -0
  244. package/dist/esm/util/primitives.js +32 -0
  245. package/dist/esm/util/runtime.js +15 -0
  246. package/dist/esm/util/signal-address.js +5 -0
  247. package/dist/index.js +52 -0
  248. package/dist/infra/log/ConsoleLogger.js +44 -0
  249. package/dist/infra/log/PinoLogger.js +111 -0
  250. package/dist/infra/log/types.js +2 -0
  251. package/dist/infra/perf/BoundedTaskQueue.js +67 -0
  252. package/dist/media/WaMediaCrypto.js +228 -0
  253. package/dist/media/WaMediaTransferClient.js +365 -0
  254. package/dist/media/conn.js +36 -0
  255. package/dist/media/constants.js +21 -0
  256. package/dist/media/index.js +9 -0
  257. package/dist/media/types.js +2 -0
  258. package/dist/message/WaMessageClient.js +214 -0
  259. package/dist/message/ack.js +52 -0
  260. package/dist/message/content.js +24 -0
  261. package/dist/message/device-sent.js +53 -0
  262. package/dist/message/incoming.js +321 -0
  263. package/dist/message/index.js +20 -0
  264. package/dist/message/padding.js +24 -0
  265. package/dist/message/phash.js +28 -0
  266. package/dist/message/types.js +2 -0
  267. package/dist/proto.js +5 -0
  268. package/dist/protocol/appstate.js +37 -0
  269. package/dist/protocol/auth.js +15 -0
  270. package/dist/protocol/browser.js +45 -0
  271. package/dist/protocol/constants.js +46 -0
  272. package/dist/protocol/defaults.js +30 -0
  273. package/dist/protocol/dirty.js +29 -0
  274. package/dist/protocol/group.js +8 -0
  275. package/dist/protocol/index.js +53 -0
  276. package/dist/protocol/jid.js +107 -0
  277. package/dist/protocol/media.js +24 -0
  278. package/dist/protocol/message.js +19 -0
  279. package/dist/protocol/nodes.js +86 -0
  280. package/dist/protocol/notification.js +53 -0
  281. package/dist/protocol/stream.js +63 -0
  282. package/dist/retry/constants.js +23 -0
  283. package/dist/retry/index.js +19 -0
  284. package/dist/retry/outbound.js +88 -0
  285. package/dist/retry/parse.js +133 -0
  286. package/dist/retry/reason.js +53 -0
  287. package/dist/retry/replay.js +181 -0
  288. package/dist/retry/types.js +2 -0
  289. package/dist/signal/api/SignalDeviceSyncApi.js +189 -0
  290. package/dist/signal/api/SignalDigestSyncApi.js +183 -0
  291. package/dist/signal/api/SignalIdentitySyncApi.js +115 -0
  292. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +145 -0
  293. package/dist/signal/api/SignalRotateKeyApi.js +63 -0
  294. package/dist/signal/api/SignalSessionSyncApi.js +191 -0
  295. package/dist/signal/api/codec.js +27 -0
  296. package/dist/signal/api/constants.js +12 -0
  297. package/dist/signal/api/prekeys.js +16 -0
  298. package/dist/signal/constants.js +19 -0
  299. package/dist/signal/crypto/WaAdvSignature.js +72 -0
  300. package/dist/signal/crypto/constants.js +11 -0
  301. package/dist/signal/group/SenderKeyChain.js +101 -0
  302. package/dist/signal/group/SenderKeyCodec.js +50 -0
  303. package/dist/signal/group/SenderKeyManager.js +180 -0
  304. package/dist/signal/index.js +29 -0
  305. package/dist/signal/registration/keygen.js +37 -0
  306. package/dist/signal/registration/utils.js +19 -0
  307. package/dist/signal/session/SignalProtocol.js +126 -0
  308. package/dist/signal/session/SignalRatchet.js +268 -0
  309. package/dist/signal/session/SignalSerializer.js +69 -0
  310. package/dist/signal/session/SignalSession.js +165 -0
  311. package/dist/signal/store/sqlite.js +324 -0
  312. package/dist/signal/types.js +2 -0
  313. package/dist/store/contracts/appstate.store.js +2 -0
  314. package/dist/store/contracts/auth.store.js +2 -0
  315. package/dist/store/contracts/contact.store.js +2 -0
  316. package/dist/store/contracts/device-list.store.js +2 -0
  317. package/dist/store/contracts/message.store.js +2 -0
  318. package/dist/store/contracts/participants.store.js +2 -0
  319. package/dist/store/contracts/retry.store.js +2 -0
  320. package/dist/store/contracts/sender-key.store.js +2 -0
  321. package/dist/store/contracts/signal.store.js +2 -0
  322. package/dist/store/contracts/thread.store.js +2 -0
  323. package/dist/store/createStore.js +281 -0
  324. package/dist/store/index.js +43 -0
  325. package/dist/store/noop.store.js +46 -0
  326. package/dist/store/providers/memory/appstate.store.js +105 -0
  327. package/dist/store/providers/memory/contact.store.js +27 -0
  328. package/dist/store/providers/memory/device-list.store.js +90 -0
  329. package/dist/store/providers/memory/message.store.js +44 -0
  330. package/dist/store/providers/memory/participants.store.js +65 -0
  331. package/dist/store/providers/memory/retry.store.js +75 -0
  332. package/dist/store/providers/memory/sender-key.store.js +92 -0
  333. package/dist/store/providers/memory/signal.store.js +174 -0
  334. package/dist/store/providers/memory/thread.store.js +38 -0
  335. package/dist/store/providers/sqlite/BaseSqliteStore.js +41 -0
  336. package/dist/store/providers/sqlite/appstate.store.js +173 -0
  337. package/dist/store/providers/sqlite/auth.store.js +180 -0
  338. package/dist/store/providers/sqlite/connection.js +276 -0
  339. package/dist/store/providers/sqlite/contact.store.js +65 -0
  340. package/dist/store/providers/sqlite/device-list.store.js +159 -0
  341. package/dist/store/providers/sqlite/message.store.js +123 -0
  342. package/dist/store/providers/sqlite/migrations.js +350 -0
  343. package/dist/store/providers/sqlite/participants.store.js +89 -0
  344. package/dist/store/providers/sqlite/retry.store.js +148 -0
  345. package/dist/store/providers/sqlite/sender-key.store.js +207 -0
  346. package/dist/store/providers/sqlite/signal.store.js +357 -0
  347. package/dist/store/providers/sqlite/thread.store.js +76 -0
  348. package/dist/store/types.js +2 -0
  349. package/dist/transport/WaComms.js +531 -0
  350. package/dist/transport/WaWebSocket.js +365 -0
  351. package/dist/transport/binary/constants.js +99 -0
  352. package/dist/transport/binary/decoder.js +279 -0
  353. package/dist/transport/binary/encoder.js +214 -0
  354. package/dist/transport/binary/index.js +23 -0
  355. package/dist/transport/binary/tokens.js +1283 -0
  356. package/dist/transport/index.js +18 -0
  357. package/dist/transport/keepalive/WaKeepAlive.js +145 -0
  358. package/dist/transport/node/WaNodeOrchestrator.js +147 -0
  359. package/dist/transport/node/WaNodeTransport.js +68 -0
  360. package/dist/transport/node/builders/accountSync.js +110 -0
  361. package/dist/transport/node/builders/group.js +52 -0
  362. package/dist/transport/node/builders/index.js +39 -0
  363. package/dist/transport/node/builders/media.js +13 -0
  364. package/dist/transport/node/builders/message.js +328 -0
  365. package/dist/transport/node/builders/pairing.js +137 -0
  366. package/dist/transport/node/builders/prekeys.js +107 -0
  367. package/dist/transport/node/builders/retry.js +119 -0
  368. package/dist/transport/node/helpers.js +46 -0
  369. package/dist/transport/node/query.js +59 -0
  370. package/dist/transport/node/xml.js +42 -0
  371. package/dist/transport/noise/WaClientPayload.js +166 -0
  372. package/dist/transport/noise/WaFrameCodec.js +125 -0
  373. package/dist/transport/noise/WaNoiseCert.js +77 -0
  374. package/dist/transport/noise/WaNoiseHandshake.js +61 -0
  375. package/dist/transport/noise/WaNoiseSession.js +326 -0
  376. package/dist/transport/noise/WaNoiseSocket.js +21 -0
  377. package/dist/transport/noise/constants.js +11 -0
  378. package/dist/transport/noise/types.js +2 -0
  379. package/dist/transport/stream/parse.js +97 -0
  380. package/dist/transport/types.js +2 -0
  381. package/dist/types/appstate/WaAppStateCrypto.d.ts +59 -0
  382. package/dist/types/appstate/WaAppStateSyncClient.d.ts +63 -0
  383. package/dist/types/appstate/WaAppStateSyncResponseParser.d.ts +12 -0
  384. package/dist/types/appstate/constants.d.ts +14 -0
  385. package/dist/types/appstate/index.d.ts +7 -0
  386. package/dist/types/appstate/store/sqlite.d.ts +21 -0
  387. package/dist/types/appstate/types.d.ts +66 -0
  388. package/dist/types/appstate/utils.d.ts +10 -0
  389. package/dist/types/auth/WaAuthClient.d.ts +61 -0
  390. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +14 -0
  391. package/dist/types/auth/index.d.ts +6 -0
  392. package/dist/types/auth/pairing/WaPairingCodeCrypto.d.ts +17 -0
  393. package/dist/types/auth/pairing/WaPairingFlow.d.ts +48 -0
  394. package/dist/types/auth/pairing/WaQrFlow.d.ts +23 -0
  395. package/dist/types/auth/pairing/constants.d.ts +2 -0
  396. package/dist/types/auth/types.d.ts +48 -0
  397. package/dist/types/client/WaClient.d.ts +97 -0
  398. package/dist/types/client/WaClientFactory.d.ts +83 -0
  399. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +48 -0
  400. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +60 -0
  401. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +90 -0
  402. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +43 -0
  403. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +61 -0
  404. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +17 -0
  405. package/dist/types/client/dirty.d.ts +17 -0
  406. package/dist/types/client/events/chat.d.ts +3 -0
  407. package/dist/types/client/events/group.d.ts +7 -0
  408. package/dist/types/client/history-sync.d.ts +17 -0
  409. package/dist/types/client/incoming.d.ts +35 -0
  410. package/dist/types/client/index.d.ts +2 -0
  411. package/dist/types/client/mailbox.d.ts +12 -0
  412. package/dist/types/client/messages.d.ts +17 -0
  413. package/dist/types/client/types.d.ts +235 -0
  414. package/dist/types/crypto/core/constants.d.ts +1 -0
  415. package/dist/types/crypto/core/encoding.d.ts +11 -0
  416. package/dist/types/crypto/core/hkdf.d.ts +8 -0
  417. package/dist/types/crypto/core/index.d.ts +11 -0
  418. package/dist/types/crypto/core/keys.d.ts +20 -0
  419. package/dist/types/crypto/core/nonce.d.ts +5 -0
  420. package/dist/types/crypto/core/primitives.d.ts +25 -0
  421. package/dist/types/crypto/core/random.d.ts +8 -0
  422. package/dist/types/crypto/curves/Ed25519.d.ts +7 -0
  423. package/dist/types/crypto/curves/X25519.d.ts +8 -0
  424. package/dist/types/crypto/curves/constants.d.ts +2 -0
  425. package/dist/types/crypto/curves/types.d.ts +10 -0
  426. package/dist/types/crypto/index.d.ts +3 -0
  427. package/dist/types/crypto/math/constants.d.ts +7 -0
  428. package/dist/types/crypto/math/edwards.d.ts +3 -0
  429. package/dist/types/crypto/math/le.d.ts +2 -0
  430. package/dist/types/crypto/math/mod.d.ts +5 -0
  431. package/dist/types/crypto/math/types.d.ts +6 -0
  432. package/dist/types/index.d.ts +10 -0
  433. package/dist/types/infra/log/ConsoleLogger.d.ts +11 -0
  434. package/dist/types/infra/log/PinoLogger.d.ts +30 -0
  435. package/dist/types/infra/log/types.d.ts +9 -0
  436. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +19 -0
  437. package/dist/types/media/WaMediaCrypto.d.ts +12 -0
  438. package/dist/types/media/WaMediaTransferClient.d.ts +81 -0
  439. package/dist/types/media/conn.d.ts +3 -0
  440. package/dist/types/media/constants.d.ts +10 -0
  441. package/dist/types/media/index.d.ts +4 -0
  442. package/dist/types/media/types.d.ts +56 -0
  443. package/dist/types/message/WaMessageClient.d.ts +29 -0
  444. package/dist/types/message/ack.d.ts +5 -0
  445. package/dist/types/message/content.d.ts +4 -0
  446. package/dist/types/message/device-sent.d.ts +3 -0
  447. package/dist/types/message/incoming.d.ts +18 -0
  448. package/dist/types/message/index.d.ts +2 -0
  449. package/dist/types/message/padding.d.ts +2 -0
  450. package/dist/types/message/phash.d.ts +1 -0
  451. package/dist/types/message/types.d.ts +58 -0
  452. package/dist/types/proto.d.ts +2 -0
  453. package/dist/types/protocol/appstate.d.ts +34 -0
  454. package/dist/types/protocol/auth.d.ts +12 -0
  455. package/dist/types/protocol/browser.d.ts +22 -0
  456. package/dist/types/protocol/constants.d.ts +11 -0
  457. package/dist/types/protocol/defaults.d.ts +26 -0
  458. package/dist/types/protocol/dirty.d.ts +15 -0
  459. package/dist/types/protocol/group.d.ts +6 -0
  460. package/dist/types/protocol/index.d.ts +11 -0
  461. package/dist/types/protocol/jid.d.ts +19 -0
  462. package/dist/types/protocol/media.d.ts +15 -0
  463. package/dist/types/protocol/message.d.ts +16 -0
  464. package/dist/types/protocol/nodes.d.ts +83 -0
  465. package/dist/types/protocol/notification.d.ts +50 -0
  466. package/dist/types/protocol/stream.d.ts +60 -0
  467. package/dist/types/retry/constants.d.ts +21 -0
  468. package/dist/types/retry/index.d.ts +7 -0
  469. package/dist/types/retry/outbound.d.ts +4 -0
  470. package/dist/types/retry/parse.d.ts +3 -0
  471. package/dist/types/retry/reason.d.ts +2 -0
  472. package/dist/types/retry/replay.d.ts +30 -0
  473. package/dist/types/retry/types.d.ts +70 -0
  474. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +31 -0
  475. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +27 -0
  476. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +26 -0
  477. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +39 -0
  478. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +22 -0
  479. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +38 -0
  480. package/dist/types/signal/api/codec.d.ts +3 -0
  481. package/dist/types/signal/api/constants.d.ts +9 -0
  482. package/dist/types/signal/api/prekeys.d.ts +6 -0
  483. package/dist/types/signal/constants.d.ts +14 -0
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +7 -0
  485. package/dist/types/signal/crypto/constants.d.ts +5 -0
  486. package/dist/types/signal/group/SenderKeyChain.d.ts +11 -0
  487. package/dist/types/signal/group/SenderKeyCodec.d.ts +14 -0
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +22 -0
  489. package/dist/types/signal/index.d.ts +12 -0
  490. package/dist/types/signal/registration/keygen.d.ts +5 -0
  491. package/dist/types/signal/registration/utils.d.ts +9 -0
  492. package/dist/types/signal/session/SignalProtocol.d.ts +22 -0
  493. package/dist/types/signal/session/SignalRatchet.d.ts +25 -0
  494. package/dist/types/signal/session/SignalSerializer.d.ts +6 -0
  495. package/dist/types/signal/session/SignalSession.d.ts +43 -0
  496. package/dist/types/signal/store/sqlite.d.ts +72 -0
  497. package/dist/types/signal/types.d.ts +110 -0
  498. package/dist/types/store/contracts/appstate.store.d.ts +22 -0
  499. package/dist/types/store/contracts/auth.store.d.ts +6 -0
  500. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  501. package/dist/types/store/contracts/device-list.store.d.ts +16 -0
  502. package/dist/types/store/contracts/message.store.d.ts +18 -0
  503. package/dist/types/store/contracts/participants.store.d.ts +14 -0
  504. package/dist/types/store/contracts/retry.store.d.ts +11 -0
  505. package/dist/types/store/contracts/sender-key.store.d.ts +16 -0
  506. package/dist/types/store/contracts/signal.store.d.ts +31 -0
  507. package/dist/types/store/contracts/thread.store.d.ts +17 -0
  508. package/dist/types/store/createStore.d.ts +2 -0
  509. package/dist/types/store/index.d.ts +31 -0
  510. package/dist/types/store/noop.store.d.ts +10 -0
  511. package/dist/types/store/providers/memory/appstate.store.d.ts +21 -0
  512. package/dist/types/store/providers/memory/contact.store.d.ts +13 -0
  513. package/dist/types/store/providers/memory/device-list.store.d.ts +20 -0
  514. package/dist/types/store/providers/memory/message.store.d.ts +14 -0
  515. package/dist/types/store/providers/memory/participants.store.d.ts +18 -0
  516. package/dist/types/store/providers/memory/retry.store.d.ts +18 -0
  517. package/dist/types/store/providers/memory/sender-key.store.d.ts +28 -0
  518. package/dist/types/store/providers/memory/signal.store.d.ts +51 -0
  519. package/dist/types/store/providers/memory/thread.store.d.ts +14 -0
  520. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +12 -0
  521. package/dist/types/store/providers/sqlite/appstate.store.d.ts +15 -0
  522. package/dist/types/store/providers/sqlite/auth.store.d.ts +10 -0
  523. package/dist/types/store/providers/sqlite/connection.d.ts +10 -0
  524. package/dist/types/store/providers/sqlite/contact.store.d.ts +10 -0
  525. package/dist/types/store/providers/sqlite/device-list.store.d.ts +18 -0
  526. package/dist/types/store/providers/sqlite/message.store.d.ts +11 -0
  527. package/dist/types/store/providers/sqlite/migrations.d.ts +3 -0
  528. package/dist/types/store/providers/sqlite/participants.store.d.ts +13 -0
  529. package/dist/types/store/providers/sqlite/retry.store.d.ts +16 -0
  530. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +25 -0
  531. package/dist/types/store/providers/sqlite/signal.store.d.ts +46 -0
  532. package/dist/types/store/providers/sqlite/thread.store.d.ts +11 -0
  533. package/dist/types/store/types.d.ts +103 -0
  534. package/dist/types/transport/WaComms.d.ts +61 -0
  535. package/dist/types/transport/WaWebSocket.d.ts +36 -0
  536. package/dist/types/transport/binary/constants.d.ts +49 -0
  537. package/dist/types/transport/binary/decoder.d.ts +3 -0
  538. package/dist/types/transport/binary/encoder.d.ts +3 -0
  539. package/dist/types/transport/binary/index.d.ts +4 -0
  540. package/dist/types/transport/binary/tokens.d.ts +11 -0
  541. package/dist/types/transport/index.d.ts +7 -0
  542. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +39 -0
  543. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +28 -0
  544. package/dist/types/transport/node/WaNodeTransport.d.ts +22 -0
  545. package/dist/types/transport/node/builders/accountSync.d.ts +11 -0
  546. package/dist/types/transport/node/builders/group.d.ts +16 -0
  547. package/dist/types/transport/node/builders/index.d.ts +7 -0
  548. package/dist/types/transport/node/builders/media.d.ts +2 -0
  549. package/dist/types/transport/node/builders/message.d.ts +52 -0
  550. package/dist/types/transport/node/builders/pairing.d.ts +18 -0
  551. package/dist/types/transport/node/builders/prekeys.d.ts +5 -0
  552. package/dist/types/transport/node/builders/retry.d.ts +18 -0
  553. package/dist/types/transport/node/helpers.d.ts +8 -0
  554. package/dist/types/transport/node/query.d.ts +10 -0
  555. package/dist/types/transport/node/xml.d.ts +2 -0
  556. package/dist/types/transport/noise/WaClientPayload.d.ts +3 -0
  557. package/dist/types/transport/noise/WaFrameCodec.d.ts +9 -0
  558. package/dist/types/transport/noise/WaNoiseCert.d.ts +1 -0
  559. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +14 -0
  560. package/dist/types/transport/noise/WaNoiseSession.d.ts +33 -0
  561. package/dist/types/transport/noise/WaNoiseSocket.d.ts +10 -0
  562. package/dist/types/transport/noise/constants.d.ts +7 -0
  563. package/dist/types/transport/noise/types.d.ts +23 -0
  564. package/dist/types/transport/stream/parse.d.ts +23 -0
  565. package/dist/types/transport/types.d.ts +71 -0
  566. package/dist/types/util/async.d.ts +1 -0
  567. package/dist/types/util/base64.d.ts +4 -0
  568. package/dist/types/util/bytes.d.ts +28 -0
  569. package/dist/types/util/coercion.d.ts +8 -0
  570. package/dist/types/util/collections.d.ts +3 -0
  571. package/dist/types/util/primitives.d.ts +7 -0
  572. package/dist/types/util/runtime.d.ts +2 -0
  573. package/dist/types/util/signal-address.d.ts +2 -0
  574. package/dist/util/async.js +8 -0
  575. package/dist/util/base64.js +24 -0
  576. package/dist/util/bytes.js +291 -0
  577. package/dist/util/coercion.js +66 -0
  578. package/dist/util/collections.js +32 -0
  579. package/dist/util/primitives.js +37 -0
  580. package/dist/util/runtime.js +19 -0
  581. package/dist/util/signal-address.js +8 -0
  582. package/package.json +150 -0
  583. package/proto/index.d.ts +10861 -0
  584. package/proto/index.js +1 -0
  585. package/scripts/check-node-version.cjs +55 -0
@@ -0,0 +1,227 @@
1
+ import { parseGroupNotificationEvents } from './events/group.js';
2
+ import { WA_NODE_TAGS, WA_NOTIFICATION_TYPES } from '../protocol/constants.js';
3
+ import { buildInboundReceiptAckNode, buildInboundRetryReceiptAckNode } from '../transport/node/builders/message.js';
4
+ import { buildNotificationAckNode } from '../transport/node/builders/pairing.js';
5
+ import { getFirstNodeChild, getNodeChildrenByTag } from '../transport/node/helpers.js';
6
+ import { parseOptionalInt } from '../transport/stream/parse.js';
7
+ import { toError } from '../util/primitives.js';
8
+ const LOGOUT_FAILURE_REASONS = new Set([401, 403, 406]);
9
+ const DISCONNECT_FAILURE_REASONS = new Set([405, 409, 503]);
10
+ const CORE_NOTIFICATION_TYPES = new Set([
11
+ 'server_sync',
12
+ 'picture',
13
+ 'contacts',
14
+ 'devices',
15
+ 'disappearing_mode',
16
+ 'mediaretry',
17
+ 'encrypt',
18
+ 'server',
19
+ 'status',
20
+ 'account_sync',
21
+ 'privacy_token',
22
+ 'newsletter',
23
+ 'w:growth',
24
+ 'registration',
25
+ 'mex'
26
+ ]);
27
+ const OUT_OF_SCOPE_NOTIFICATION_TYPES = new Set([
28
+ 'business',
29
+ 'pay',
30
+ 'psa',
31
+ 'waffle',
32
+ 'hosted'
33
+ ]);
34
+ export function createIncomingBaseEvent(node) {
35
+ return {
36
+ rawNode: node,
37
+ stanzaId: node.attrs.id,
38
+ chatJid: node.attrs.from,
39
+ stanzaType: node.attrs.type
40
+ };
41
+ }
42
+ async function sendSafeAck(logger, sendNode, node) {
43
+ try {
44
+ await sendNode(node);
45
+ }
46
+ catch (error) {
47
+ logger.warn('failed to send inbound ack', {
48
+ tag: node.tag,
49
+ class: node.attrs.class,
50
+ type: node.attrs.type,
51
+ id: node.attrs.id,
52
+ message: toError(error).message
53
+ });
54
+ }
55
+ }
56
+ function classifyNotificationType(notificationType) {
57
+ if (CORE_NOTIFICATION_TYPES.has(notificationType)) {
58
+ return 'core';
59
+ }
60
+ if (OUT_OF_SCOPE_NOTIFICATION_TYPES.has(notificationType)) {
61
+ return 'out_of_scope';
62
+ }
63
+ return 'unknown';
64
+ }
65
+ async function applyFailureAction(options, reason, clearStoredCredentials) {
66
+ try {
67
+ await options.disconnect();
68
+ if (clearStoredCredentials) {
69
+ await options.clearStoredCredentials();
70
+ }
71
+ }
72
+ catch (error) {
73
+ options.logger.warn('failed applying failure stanza action', {
74
+ reason,
75
+ clearStoredCredentials,
76
+ message: toError(error).message
77
+ });
78
+ }
79
+ }
80
+ export function createIncomingReceiptHandler(options) {
81
+ return async (node) => {
82
+ if (!node.attrs.id || !node.attrs.from) {
83
+ options.logger.warn('incoming receipt missing required attrs for ack', {
84
+ hasFrom: node.attrs.from !== undefined,
85
+ hasId: node.attrs.id !== undefined,
86
+ type: node.attrs.type
87
+ });
88
+ return true;
89
+ }
90
+ options.emitIncomingReceipt({
91
+ ...createIncomingBaseEvent(node),
92
+ participantJid: node.attrs.participant,
93
+ recipientJid: node.attrs.recipient
94
+ });
95
+ try {
96
+ await options.trackOutboundReceipt?.(node);
97
+ }
98
+ catch (error) {
99
+ options.logger.warn('failed to track outbound message receipt state', {
100
+ id: node.attrs.id,
101
+ from: node.attrs.from,
102
+ type: node.attrs.type,
103
+ message: toError(error).message
104
+ });
105
+ }
106
+ const receiptType = node.attrs.type;
107
+ if (receiptType === 'retry' || receiptType === 'enc_rekey_retry') {
108
+ if (options.handleIncomingRetryReceipt) {
109
+ await options.handleIncomingRetryReceipt(node);
110
+ }
111
+ else {
112
+ await sendSafeAck(options.logger, options.sendNode, buildInboundRetryReceiptAckNode(node));
113
+ }
114
+ return true;
115
+ }
116
+ await sendSafeAck(options.logger, options.sendNode, buildInboundReceiptAckNode(node));
117
+ return true;
118
+ };
119
+ }
120
+ export function createIncomingFailureHandler(options) {
121
+ return async (node) => {
122
+ const reason = parseOptionalInt(node.attrs.reason);
123
+ const code = parseOptionalInt(node.attrs.code);
124
+ options.emitIncomingFailure({
125
+ ...createIncomingBaseEvent(node),
126
+ failureReason: reason,
127
+ failureCode: code,
128
+ failureMessage: node.attrs.message,
129
+ failureUrl: node.attrs.url
130
+ });
131
+ const shouldClearStoredCredentials = reason !== undefined && LOGOUT_FAILURE_REASONS.has(reason);
132
+ if (shouldClearStoredCredentials ||
133
+ (reason !== undefined && DISCONNECT_FAILURE_REASONS.has(reason))) {
134
+ await applyFailureAction(options, reason ?? 0, shouldClearStoredCredentials);
135
+ }
136
+ return true;
137
+ };
138
+ }
139
+ export function createIncomingNotificationHandler(options) {
140
+ return async (node) => {
141
+ const notificationType = node.attrs.type ?? '';
142
+ const classification = classifyNotificationType(notificationType);
143
+ const firstChildTag = getFirstNodeChild(node)?.tag;
144
+ const serverSyncCollections = notificationType === 'server_sync'
145
+ ? getNodeChildrenByTag(node, WA_NODE_TAGS.COLLECTION)
146
+ .map((collectionNode) => collectionNode.attrs.name)
147
+ .filter((name) => typeof name === 'string' && name.length > 0)
148
+ : [];
149
+ options.emitIncomingNotification({
150
+ ...createIncomingBaseEvent(node),
151
+ notificationType,
152
+ classification,
153
+ details: firstChildTag || serverSyncCollections.length > 0
154
+ ? {
155
+ ...(firstChildTag ? { firstChildTag } : {}),
156
+ ...(serverSyncCollections.length > 0
157
+ ? { collections: serverSyncCollections }
158
+ : {})
159
+ }
160
+ : undefined
161
+ });
162
+ if (classification === 'out_of_scope') {
163
+ options.emitUnhandledStanza({
164
+ ...createIncomingBaseEvent(node),
165
+ reason: `notification.${notificationType}.out_of_scope`
166
+ });
167
+ }
168
+ else if (classification === 'unknown') {
169
+ options.emitUnhandledStanza({
170
+ ...createIncomingBaseEvent(node),
171
+ reason: `notification.${notificationType || 'unknown'}.not_supported`
172
+ });
173
+ }
174
+ await sendSafeAck(options.logger, options.sendNode, buildNotificationAckNode(node));
175
+ if (notificationType === 'server_sync' && serverSyncCollections.length > 0) {
176
+ if (!options.syncAppState) {
177
+ options.logger.warn('received server_sync notification without app-state sync runtime', {
178
+ collections: serverSyncCollections.join(',')
179
+ });
180
+ return true;
181
+ }
182
+ void options.syncAppState().catch((error) => {
183
+ options.logger.warn('failed to sync app-state after server_sync notification', {
184
+ collections: serverSyncCollections.join(','),
185
+ message: toError(error).message
186
+ });
187
+ });
188
+ }
189
+ return true;
190
+ };
191
+ }
192
+ export function createIncomingGroupNotificationHandler(options) {
193
+ return async (node) => {
194
+ if (node.attrs.type !== WA_NOTIFICATION_TYPES.GROUP) {
195
+ return false;
196
+ }
197
+ const parsed = parseGroupNotificationEvents(node);
198
+ for (const event of parsed.events) {
199
+ options.emitGroupEvent(event);
200
+ }
201
+ for (const unhandled of parsed.unhandled) {
202
+ options.emitUnhandledStanza(unhandled);
203
+ }
204
+ if (parsed.events.length === 0 && parsed.unhandled.length === 0) {
205
+ options.emitUnhandledStanza({
206
+ ...createIncomingBaseEvent(node),
207
+ reason: `notification.${WA_NOTIFICATION_TYPES.GROUP}.empty`
208
+ });
209
+ }
210
+ await sendSafeAck(options.logger, options.sendNode, buildNotificationAckNode(node));
211
+ return true;
212
+ };
213
+ }
214
+ export function createInfoBulletinNotificationEvent(node, type, details) {
215
+ return {
216
+ ...createIncomingBaseEvent(node),
217
+ notificationType: `ib.${type}`,
218
+ classification: 'info_bulletin',
219
+ details
220
+ };
221
+ }
222
+ export function createUnhandledIncomingNodeEvent(node, reason = `unhandled.${node.tag}`) {
223
+ return {
224
+ ...createIncomingBaseEvent(node),
225
+ reason
226
+ };
227
+ }
@@ -0,0 +1 @@
1
+ export { WaClient } from './WaClient.js';
@@ -0,0 +1,46 @@
1
+ import { proto } from '../proto.js';
2
+ import { toError } from '../util/primitives.js';
3
+ async function persistContacts(contactStore, event, nowMs) {
4
+ const candidateJids = new Set();
5
+ if (event.senderJid) {
6
+ candidateJids.add(event.senderJid);
7
+ }
8
+ if (event.rawNode.attrs.participant) {
9
+ candidateJids.add(event.rawNode.attrs.participant);
10
+ }
11
+ await Promise.all(Array.from(candidateJids, (jid) => contactStore.upsert({ jid, lastUpdatedMs: nowMs })));
12
+ }
13
+ export async function persistIncomingMailboxEntities(options) {
14
+ const { logger, contactStore, messageStore, event } = options;
15
+ const { stanzaId, chatJid } = event;
16
+ if (!stanzaId || !chatJid) {
17
+ return;
18
+ }
19
+ const nowMs = Date.now();
20
+ try {
21
+ const messageBytes = event.message
22
+ ? proto.Message.encode(event.message).finish()
23
+ : undefined;
24
+ await Promise.all([
25
+ messageStore.upsert({
26
+ id: stanzaId,
27
+ threadJid: chatJid,
28
+ senderJid: event.senderJid,
29
+ participantJid: event.rawNode.attrs.participant,
30
+ fromMe: false,
31
+ timestampMs: event.timestampSeconds === undefined ? undefined : event.timestampSeconds * 1000,
32
+ encType: event.encryptionType,
33
+ plaintext: event.plaintext,
34
+ messageBytes
35
+ }),
36
+ persistContacts(contactStore, event, nowMs)
37
+ ]);
38
+ }
39
+ catch (error) {
40
+ logger.warn('failed to persist incoming mailbox entities', {
41
+ id: stanzaId,
42
+ from: chatJid,
43
+ message: toError(error).message
44
+ });
45
+ }
46
+ }
@@ -0,0 +1,148 @@
1
+ import { parseMediaConnResponse } from '../media/conn.js';
2
+ import { MEDIA_CONN_CACHE_GRACE_MS, MEDIA_UPLOAD_PATHS } from '../media/constants.js';
3
+ import { WaMediaCrypto } from '../media/WaMediaCrypto.js';
4
+ import { isSendMediaMessage } from '../message/content.js';
5
+ import { WA_DEFAULTS } from '../protocol/constants.js';
6
+ import { buildMediaConnIq } from '../transport/node/builders/media.js';
7
+ import { bytesToBase64UrlSafe } from '../util/base64.js';
8
+ import { TEXT_DECODER, toBytesView } from '../util/bytes.js';
9
+ import { toError } from '../util/primitives.js';
10
+ export async function buildMediaMessageContent(options, content) {
11
+ if (typeof content === 'string') {
12
+ return {
13
+ conversation: content
14
+ };
15
+ }
16
+ if (isSendMediaMessage(content)) {
17
+ return buildMediaMessage(options, content);
18
+ }
19
+ if (!content || typeof content !== 'object') {
20
+ throw new Error('invalid message content');
21
+ }
22
+ return content;
23
+ }
24
+ export async function getMediaConn(options, forceRefresh = false) {
25
+ const cached = options.getMediaConnCache();
26
+ if (!forceRefresh && cached && Date.now() + MEDIA_CONN_CACHE_GRACE_MS < cached.expiresAtMs) {
27
+ return cached;
28
+ }
29
+ const response = await options.queryWithContext('media_conn.fetch', buildMediaConnIq(), options.iqTimeoutMs ?? WA_DEFAULTS.IQ_TIMEOUT_MS);
30
+ const mediaConn = parseMediaConnResponse(response, Date.now());
31
+ options.setMediaConnCache(mediaConn);
32
+ return mediaConn;
33
+ }
34
+ async function buildMediaMessage(options, content) {
35
+ const mediaBytes = toBytesView(content.media);
36
+ const uploaded = await uploadMedia(options, content, mediaBytes);
37
+ const mediaKeyTimestamp = Math.floor(Date.now() / 1000);
38
+ const common = {
39
+ url: uploaded.url,
40
+ mimetype: content.mimetype,
41
+ fileSha256: uploaded.fileSha256,
42
+ fileLength: mediaBytes.byteLength,
43
+ mediaKey: uploaded.mediaKey,
44
+ fileEncSha256: uploaded.fileEncSha256,
45
+ directPath: uploaded.directPath,
46
+ mediaKeyTimestamp
47
+ };
48
+ switch (content.type) {
49
+ case 'image':
50
+ return {
51
+ imageMessage: {
52
+ ...common,
53
+ caption: content.caption,
54
+ width: content.width,
55
+ height: content.height
56
+ }
57
+ };
58
+ case 'video':
59
+ return {
60
+ videoMessage: {
61
+ ...common,
62
+ caption: content.caption,
63
+ gifPlayback: content.gifPlayback,
64
+ seconds: content.seconds,
65
+ width: content.width,
66
+ height: content.height,
67
+ metadataUrl: uploaded.metadataUrl
68
+ }
69
+ };
70
+ case 'audio':
71
+ return {
72
+ audioMessage: {
73
+ ...common,
74
+ seconds: content.seconds,
75
+ ptt: content.ptt
76
+ }
77
+ };
78
+ case 'document':
79
+ return {
80
+ documentMessage: {
81
+ ...common,
82
+ caption: content.caption,
83
+ fileName: content.fileName ?? 'file',
84
+ title: content.fileName ?? undefined
85
+ }
86
+ };
87
+ case 'sticker':
88
+ return {
89
+ stickerMessage: {
90
+ ...common,
91
+ width: content.width,
92
+ height: content.height
93
+ }
94
+ };
95
+ default:
96
+ throw new Error(`unsupported media type: ${content.type}`);
97
+ }
98
+ }
99
+ async function uploadMedia(options, content, mediaBytes) {
100
+ const mediaKey = await WaMediaCrypto.generateMediaKey();
101
+ const uploadType = content.type === 'video' && content.gifPlayback
102
+ ? 'gif'
103
+ : content.type === 'audio' && content.ptt
104
+ ? 'ptt'
105
+ : content.type;
106
+ const [encrypted, mediaConn] = await Promise.all([
107
+ WaMediaCrypto.encryptBytes(uploadType, mediaKey, mediaBytes),
108
+ getMediaConn(options)
109
+ ]);
110
+ const selectedHost = mediaConn.hosts.find((host) => !host.isFallback)?.hostname ?? mediaConn.hosts[0].hostname;
111
+ const uploadPath = MEDIA_UPLOAD_PATHS[uploadType];
112
+ const hashToken = bytesToBase64UrlSafe(encrypted.fileEncSha256);
113
+ const uploadUrl = `https://${selectedHost}${uploadPath}/${hashToken}?auth=${encodeURIComponent(mediaConn.auth)}&token=${encodeURIComponent(hashToken)}`;
114
+ options.logger.debug('sending media upload request', {
115
+ mediaType: content.type,
116
+ uploadType,
117
+ host: selectedHost
118
+ });
119
+ const uploadResponse = await options.mediaTransfer.uploadStream({
120
+ url: uploadUrl,
121
+ method: 'POST',
122
+ body: encrypted.ciphertextHmac,
123
+ contentLength: encrypted.ciphertextHmac.byteLength,
124
+ contentType: content.mimetype
125
+ });
126
+ const uploadBody = await options.mediaTransfer.readResponseBytes(uploadResponse);
127
+ if (!uploadResponse.ok) {
128
+ throw new Error(`media upload failed with status ${uploadResponse.status}`);
129
+ }
130
+ let parsedBody;
131
+ try {
132
+ parsedBody = JSON.parse(TEXT_DECODER.decode(uploadBody));
133
+ }
134
+ catch (error) {
135
+ throw new Error(`media upload returned invalid json: ${toError(error).message}`);
136
+ }
137
+ if (!parsedBody.url || !parsedBody.direct_path) {
138
+ throw new Error('media upload response missing url/direct_path');
139
+ }
140
+ return {
141
+ url: parsedBody.url,
142
+ directPath: parsedBody.direct_path,
143
+ mediaKey,
144
+ fileSha256: encrypted.fileSha256,
145
+ fileEncSha256: encrypted.fileEncSha256,
146
+ ...(parsedBody.metadata_url ? { metadataUrl: parsedBody.metadata_url } : {})
147
+ };
148
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export const SERIALIZED_PUB_KEY_PREFIX = 5;
@@ -0,0 +1,25 @@
1
+ import { base64ToBytes } from '../../util/bytes.js';
2
+ /**
3
+ * Base64 URL encoding utilities
4
+ */
5
+ /**
6
+ * Decodes a base64url encoded string to Uint8Array
7
+ */
8
+ export function decodeBase64Url(value, field) {
9
+ if (!value) {
10
+ throw new Error(`missing ${field}`);
11
+ }
12
+ const padded = value
13
+ .replace(/-/g, '+')
14
+ .replace(/_/g, '/')
15
+ .padEnd(Math.ceil(value.length / 4) * 4, '=');
16
+ return base64ToBytes(padded);
17
+ }
18
+ /**
19
+ * Asserts that a Uint8Array is exactly 32 bytes
20
+ */
21
+ export function assert32(value, name) {
22
+ if (value.length !== 32) {
23
+ throw new Error(`${name} must be 32 bytes`);
24
+ }
25
+ }
@@ -0,0 +1,22 @@
1
+ import { webcrypto } from 'node:crypto';
2
+ import { EMPTY_BYTES, TEXT_ENCODER, toBytesView } from '../../util/bytes.js';
3
+ /**
4
+ * HKDF key derivation using SHA-256
5
+ */
6
+ export async function hkdf(ikm, salt, info, outLength) {
7
+ const key = await webcrypto.subtle.importKey('raw', ikm, 'HKDF', false, ['deriveBits']);
8
+ const bits = await webcrypto.subtle.deriveBits({
9
+ name: 'HKDF',
10
+ hash: 'SHA-256',
11
+ salt: salt ?? EMPTY_BYTES,
12
+ info: typeof info === 'string' ? TEXT_ENCODER.encode(info) : info
13
+ }, key, outLength * 8);
14
+ return toBytesView(bits);
15
+ }
16
+ /**
17
+ * HKDF key derivation that outputs two 32-byte keys
18
+ */
19
+ export async function hkdfSplit(ikm, salt, info) {
20
+ const out = await hkdf(ikm, salt, info, 64);
21
+ return [out.subarray(0, 32), out.subarray(32, 64)];
22
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cryptographic utilities
3
+ */
4
+ export { Ed25519 } from '../curves/Ed25519.js';
5
+ export { X25519 } from '../curves/X25519.js';
6
+ export { decodeBase64Url, assert32 } from '../core/encoding.js';
7
+ export { hkdf, hkdfSplit } from '../core/hkdf.js';
8
+ export { toSerializedPubKey, toRawPubKey, prependVersion, readVersionedContent } from '../core/keys.js';
9
+ export { buildNonce } from '../core/nonce.js';
10
+ export { randomBytesAsync, randomIntAsync } from '../core/random.js';
11
+ export { sha1, sha256, sha512, importAesGcmKey, aesGcmEncrypt, aesGcmDecrypt, importAesCbcKey, aesCbcEncrypt, aesCbcDecrypt, importHmacKey, importHmacSha512Key, hmacSign, pbkdf2DeriveAesCtrKey, aesCtrEncrypt, aesCtrDecrypt, ed25519VerifyRaw } from '../core/primitives.js';
@@ -0,0 +1,66 @@
1
+ import { SERIALIZED_PUB_KEY_PREFIX } from '../core/constants.js';
2
+ /**
3
+ * Converts a 32-byte raw public key to 33-byte serialized format (with 0x05 prefix)
4
+ */
5
+ export function toSerializedPubKey(key) {
6
+ if (key.length === 33) {
7
+ if (key[0] !== SERIALIZED_PUB_KEY_PREFIX) {
8
+ throw new Error('invalid serialized signal public key prefix');
9
+ }
10
+ return key;
11
+ }
12
+ if (key.length !== 32) {
13
+ throw new Error(`invalid signal public key length ${key.length}`);
14
+ }
15
+ const out = new Uint8Array(33);
16
+ out[0] = SERIALIZED_PUB_KEY_PREFIX;
17
+ out.set(key, 1);
18
+ return out;
19
+ }
20
+ /**
21
+ * Converts a 33-byte serialized public key to 32-byte raw format
22
+ */
23
+ export function toRawPubKey(key) {
24
+ if (key.length === 32) {
25
+ return key;
26
+ }
27
+ if (key.length === 33 && key[0] === SERIALIZED_PUB_KEY_PREFIX) {
28
+ return key.subarray(1);
29
+ }
30
+ throw new Error(`invalid signal public key length ${key.length}`);
31
+ }
32
+ /**
33
+ * Creates a version byte from high and low nibbles
34
+ */
35
+ export function versionByte(high, low) {
36
+ return ((high << 4) | low) & 0xff;
37
+ }
38
+ /**
39
+ * Prepends a version byte to content
40
+ */
41
+ export function prependVersion(content, version) {
42
+ const out = new Uint8Array(1 + content.length);
43
+ out[0] = versionByte(version, version);
44
+ out.set(content, 1);
45
+ return out;
46
+ }
47
+ /**
48
+ * Reads versioned content, validating the version and extracting the body
49
+ */
50
+ export function readVersionedContent(versionContent, expectedVersion, suffixLength) {
51
+ if (versionContent.length < 1) {
52
+ throw new Error('signal versioned content is empty');
53
+ }
54
+ const version = versionContent[0] >>> 4;
55
+ if (version !== expectedVersion) {
56
+ if (version < expectedVersion) {
57
+ throw new Error('legacy signal version');
58
+ }
59
+ throw new Error(`unsupported signal version ${version}`);
60
+ }
61
+ const bodyEnd = versionContent.length - suffixLength;
62
+ if (bodyEnd <= 1) {
63
+ throw new Error('invalid signal content length');
64
+ }
65
+ return versionContent.subarray(1, bodyEnd);
66
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Builds a 12-byte nonce for AES-GCM encryption with counter in the last 4 bytes.
3
+ * Throws if counter exceeds uint32 range to prevent nonce reuse.
4
+ */
5
+ export function buildNonce(counter) {
6
+ if (counter > 0xffffffff) {
7
+ throw new Error('nonce counter overflow: exceeds uint32 range');
8
+ }
9
+ const nonce = new Uint8Array(12);
10
+ nonce[8] = (counter >>> 24) & 0xff;
11
+ nonce[9] = (counter >>> 16) & 0xff;
12
+ nonce[10] = (counter >>> 8) & 0xff;
13
+ nonce[11] = counter & 0xff;
14
+ return nonce;
15
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Low-level crypto primitives using WebCrypto API
3
+ */
4
+ import { createHash, webcrypto } from 'node:crypto';
5
+ import { EMPTY_BYTES, toBytesView } from '../../util/bytes.js';
6
+ // ============================================
7
+ // Hash functions
8
+ // ============================================
9
+ export async function sha256(value) {
10
+ return toBytesView(await webcrypto.subtle.digest('SHA-256', value));
11
+ }
12
+ export async function sha1(value) {
13
+ return toBytesView(await webcrypto.subtle.digest('SHA-1', value));
14
+ }
15
+ export async function sha512(value) {
16
+ return toBytesView(await webcrypto.subtle.digest('SHA-512', value));
17
+ }
18
+ export function md5Bytes(input) {
19
+ return toBytesView(createHash('md5').update(input).digest());
20
+ }
21
+ // ============================================
22
+ // AES-GCM (for Noise protocol)
23
+ // ============================================
24
+ export async function importAesGcmKey(raw, usages) {
25
+ return webcrypto.subtle.importKey('raw', raw, 'AES-GCM', false, usages);
26
+ }
27
+ export async function aesGcmEncrypt(key, nonce, plaintext, aad = EMPTY_BYTES) {
28
+ const result = await webcrypto.subtle.encrypt({ name: 'AES-GCM', iv: nonce, additionalData: aad }, key, plaintext);
29
+ return toBytesView(result);
30
+ }
31
+ export async function aesGcmDecrypt(key, nonce, ciphertext, aad = EMPTY_BYTES) {
32
+ const result = await webcrypto.subtle.decrypt({ name: 'AES-GCM', iv: nonce, additionalData: aad }, key, ciphertext);
33
+ return toBytesView(result);
34
+ }
35
+ // ============================================
36
+ // AES-CBC (for Signal protocol)
37
+ // ============================================
38
+ export async function importAesCbcKey(keyBytes) {
39
+ return webcrypto.subtle.importKey('raw', keyBytes, { name: 'AES-CBC', length: 256 }, false, [
40
+ 'encrypt',
41
+ 'decrypt'
42
+ ]);
43
+ }
44
+ export async function aesCbcEncrypt(key, iv, plaintext) {
45
+ const result = await webcrypto.subtle.encrypt({ name: 'AES-CBC', iv }, key, plaintext);
46
+ return toBytesView(result);
47
+ }
48
+ export async function aesCbcDecrypt(key, iv, ciphertext) {
49
+ const result = await webcrypto.subtle.decrypt({ name: 'AES-CBC', iv }, key, ciphertext);
50
+ return toBytesView(result);
51
+ }
52
+ // ============================================
53
+ // HMAC-SHA256 (for Signal protocol)
54
+ // ============================================
55
+ export async function importHmacKey(keyBytes) {
56
+ return webcrypto.subtle.importKey('raw', keyBytes, { name: 'HMAC', hash: 'SHA-256' }, false, [
57
+ 'sign'
58
+ ]);
59
+ }
60
+ export async function importHmacSha512Key(keyBytes) {
61
+ return webcrypto.subtle.importKey('raw', keyBytes, { name: 'HMAC', hash: 'SHA-512' }, false, [
62
+ 'sign'
63
+ ]);
64
+ }
65
+ export async function hmacSign(key, data) {
66
+ return toBytesView(await webcrypto.subtle.sign('HMAC', key, data));
67
+ }
68
+ // ============================================
69
+ // PBKDF2 → AES-CTR (for pairing code crypto)
70
+ // ============================================
71
+ export async function pbkdf2DeriveAesCtrKey(password, salt, iterations) {
72
+ const imported = await webcrypto.subtle.importKey('raw', password, { name: 'PBKDF2' }, false, [
73
+ 'deriveKey'
74
+ ]);
75
+ return webcrypto.subtle.deriveKey({
76
+ name: 'PBKDF2',
77
+ hash: 'SHA-256',
78
+ salt,
79
+ iterations
80
+ }, imported, {
81
+ name: 'AES-CTR',
82
+ length: 256
83
+ }, false, ['encrypt', 'decrypt']);
84
+ }
85
+ // ============================================
86
+ // AES-CTR (for pairing code crypto)
87
+ // ============================================
88
+ export async function aesCtrEncrypt(key, counter, plaintext) {
89
+ const result = await webcrypto.subtle.encrypt({ name: 'AES-CTR', counter, length: 64 }, key, plaintext);
90
+ return toBytesView(result);
91
+ }
92
+ export async function aesCtrDecrypt(key, counter, ciphertext) {
93
+ const result = await webcrypto.subtle.decrypt({ name: 'AES-CTR', counter, length: 64 }, key, ciphertext);
94
+ return toBytesView(result);
95
+ }
96
+ // ============================================
97
+ // Ed25519 raw verify (for Signal variant sigs)
98
+ // ============================================
99
+ export async function ed25519VerifyRaw(publicKey, signature, message) {
100
+ const cryptoKey = await webcrypto.subtle.importKey('raw', publicKey, { name: 'Ed25519' }, false, ['verify']);
101
+ return webcrypto.subtle.verify('Ed25519', cryptoKey, signature, message);
102
+ }