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
package/README.md ADDED
@@ -0,0 +1,235 @@
1
+ # zapo
2
+
3
+ <p align="center">
4
+ <strong>High-performance TypeScript implementation of the WhatsApp Web protocol.</strong><br />
5
+ Built for high-scalability workloads, multi-session operation, and full user configurability.
6
+ </p>
7
+
8
+ <p align="center">
9
+ <a href="https://www.npmjs.com/package/zapo-js">
10
+ <img alt="npm version" src="https://img.shields.io/npm/v/zapo-js?color=CB3837" />
11
+ </a>
12
+ <img alt="npm package size" src="https://img.shields.io/npm/unpacked-size/zapo-js?label=package%20size&color=2F855A" />
13
+ <img alt="node version" src="https://img.shields.io/badge/node-%3E%3D20.9.0-339933" />
14
+ <img alt="language" src="https://img.shields.io/badge/language-TypeScript-3178C6" />
15
+ <img alt="focus" src="https://img.shields.io/badge/focus-high--scale%20%2B%20multi--session-0A7EA4" />
16
+ </p>
17
+
18
+ ## Table of Contents
19
+
20
+ - [Stability Notice](#stability-notice)
21
+ - [What Makes This Project Different](#what-makes-this-project-different)
22
+ - [Core Principles](#core-principles)
23
+ - [Architecture at a Glance](#architecture-at-a-glance)
24
+ - [Requirements](#requirements)
25
+ - [Quick Start](#quick-start)
26
+ - [Minimal Usage](#minimal-usage)
27
+ - [Useful Scripts](#useful-scripts)
28
+ - [Versioning and Releases](#versioning-and-releases)
29
+ - [GitHub Release Notes](#github-release-notes)
30
+ - [Protobuf Generation](#protobuf-generation)
31
+ - [Contribution Notes](#contribution-notes)
32
+ - [Disclaimer](#disclaimer)
33
+
34
+ ## Stability Notice
35
+
36
+ > Frequent breaking changes are expected until the first major release.
37
+ > If you run `zapo` in long-lived environments, pin exact versions and validate upgrades carefully.
38
+
39
+ ## What Makes This Project Different
40
+
41
+ `zapo` is an independent runtime implementation (not a wrapper/fork of an existing WhatsApp library).
42
+
43
+ - No wrappers around third-party WhatsApp SDKs
44
+ - No forks of existing WhatsApp client libraries
45
+ - No copied protocol abstractions from community libraries
46
+ - `WAProto.proto` is sourced from `wppconnect-team/wa-proto` and compiled locally for runtime/types
47
+
48
+ The protocol source of truth is the deobfuscated WhatsApp Web.
49
+ The target is behavior parity with WhatsApp Web, while improving internal performance and memory efficiency.
50
+
51
+ ## Core Principles
52
+
53
+ These principles drive implementation decisions:
54
+
55
+ - `index-first`: validate protocol behavior against WhatsApp Web before implementing anything
56
+ - `performance-first`: optimize for low CPU, low RAM, low allocations, and zero-copy in hot paths
57
+ - `async-first`: I/O, network, and crypto operations are async
58
+
59
+ ## Architecture at a Glance
60
+
61
+ ### Patterns
62
+
63
+ - Coordinator-first feature design in `src/client/coordinators/`
64
+ - Pure node builders in `src/transport/node/builders/` for reusable protocol stanzas
65
+ - Incoming parsers/normalizers in `src/client/events/`, with coordinators handling orchestration only
66
+ - Typed store contracts in `src/store/contracts/` with `memory` and `sqlite` providers
67
+ - Protocol constants in `src/protocol/` using `Object.freeze({...} as const)`
68
+
69
+ ### Engineering conventions
70
+
71
+ - `Uint8Array` everywhere for binary data (`Buffer` is avoided)
72
+ - Zero-copy (`subarray`, byte views) in critical paths
73
+ - Bounded in-memory structures to prevent unbounded growth
74
+ - Path aliases (`@client`, `@crypto`, `@store`, etc.), no relative `../` imports
75
+ - Named exports only, no default exports
76
+ - No enums (`Object.freeze` + `as const` instead)
77
+
78
+ ## Requirements
79
+
80
+ - Node.js `>= 20.9.0`
81
+ - npm
82
+
83
+ Runtime dependencies:
84
+
85
+ - Mandatory: `protobufjs`
86
+
87
+ Optional peer dependencies:
88
+
89
+ - `better-sqlite3` for SQLite-backed stores
90
+ - `pino` and `pino-pretty` for structured logging
91
+
92
+ ## Quick Start
93
+
94
+ 1. Install dependencies.
95
+
96
+ ```bash
97
+ npm install
98
+ ```
99
+
100
+ 2. Run the real-flow example.
101
+
102
+ ```bash
103
+ npm run example
104
+ ```
105
+
106
+ 3. Scan the QR code emitted by `auth_qr`.
107
+ 4. Send `ping` to the connected session, the example replies with `pong`.
108
+
109
+ Auth state is persisted in `.auth/state.sqlite`.
110
+
111
+ ## Minimal Usage
112
+
113
+ ```ts
114
+ import { createPinoLogger, createStore, WaClient } from 'zapo-js'
115
+
116
+ const logger = await createPinoLogger({
117
+ level: 'info',
118
+ pretty: true
119
+ })
120
+
121
+ const store = createStore({
122
+ sqlite: {
123
+ path: '.auth/state.sqlite',
124
+ driver: 'auto'
125
+ },
126
+ providers: {
127
+ messages: 'sqlite',
128
+ threads: 'sqlite',
129
+ contacts: 'sqlite'
130
+ }
131
+ })
132
+
133
+ const client = new WaClient(
134
+ {
135
+ store,
136
+ sessionId: 'default',
137
+ connectTimeoutMs: 15_000,
138
+ nodeQueryTimeoutMs: 30_000,
139
+ history: {
140
+ enabled: true,
141
+ requireFullSync: true
142
+ }
143
+ },
144
+ logger
145
+ )
146
+
147
+ client.on('auth_qr', ({ qr, ttlMs }) => {
148
+ console.log('qr', { qr, ttlMs })
149
+ })
150
+
151
+ client.on('message', (event) => {
152
+ console.log('incoming', {
153
+ chatJid: event.chatJid,
154
+ senderJid: event.senderJid
155
+ })
156
+ })
157
+
158
+ await client.connect()
159
+ ```
160
+
161
+ ## Useful Scripts
162
+
163
+ - `npm run build` - build CJS, ESM, and types
164
+ - `npm run test` - run unit tests (non-flow)
165
+ - `npm run test:flow` - run real-flow tests
166
+ - `npm run test:coverage` - run coverage report
167
+ - `npm run typecheck` - type-check project
168
+ - `npm run lint` - lint source files
169
+ - `npm run format` - format codebase
170
+ - `npm run proto:generate` - regenerate protobuf runtime/types from `proto/WAProto.proto`
171
+ - `npm run changeset` - create a versioning entry (`patch`/`minor`/`major`)
172
+ - `npm run changeset:status` - show pending versioning entries
173
+ - `npm run version:packages` - apply pending versions and update `CHANGELOG.md`
174
+ - `npm run release:publish` - build and publish to npm with Changesets
175
+
176
+ ## Versioning and Releases
177
+
178
+ Versioning is managed with [Changesets](https://github.com/changesets/changesets).
179
+
180
+ Release flow:
181
+
182
+ ```bash
183
+ npm run changeset
184
+ npm run changeset:status
185
+ npm run version:packages
186
+ npm run release:publish
187
+ ```
188
+
189
+ Notes:
190
+
191
+ - Changesets are stored in `.changeset/*.md`
192
+ - Multiple changesets are merged automatically into the next release
193
+ - SemVer is manual and intentional: `patch`, `minor`, `major`
194
+
195
+ ## GitHub Release Notes
196
+
197
+ Release notes are generated automatically (including grouped changes and contributors) when a version tag is pushed.
198
+
199
+ - Workflow: `.github/workflows/github-release.yml`
200
+ - Categories config: `.github/release.yml`
201
+
202
+ Trigger example:
203
+
204
+ ```bash
205
+ git tag v0.1.1
206
+ git push origin v0.1.1
207
+ ```
208
+
209
+ If the tag contains `-` (example: `v0.2.0-rc.1`), the release is marked as prerelease.
210
+
211
+ ## Protobuf Generation
212
+
213
+ `WAProto.proto` source: https://github.com/wppconnect-team/wa-proto
214
+
215
+ `npm run proto:generate` runs `scripts/generate-proto.cjs`, which:
216
+
217
+ - Ensures proto tooling dependencies are installed in `proto/`
218
+ - Generates and minifies `proto/index.js`
219
+ - Regenerates compact typings at `proto/index.d.ts`
220
+
221
+ ## Contribution Notes
222
+
223
+ Before opening a PR:
224
+
225
+ - Validate behavior against WhatsApp Web
226
+ - Keep performance and memory constraints in mind
227
+ - Keep node building/parsing aligned with project patterns
228
+ - Avoid API changes that diverge from observed WhatsApp Web behavior
229
+ - Test real flows when touching auth, transport, app state, retry, or signal paths
230
+
231
+ ## Disclaimer
232
+
233
+ This project is an independent implementation for engineering and interoperability research.
234
+ It is not affiliated with or endorsed by WhatsApp.
235
+
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WaAppStateCrypto = void 0;
4
+ const constants_1 = require("./constants");
5
+ const utils_1 = require("./utils");
6
+ const hkdf_1 = require("../crypto/core/hkdf");
7
+ const primitives_1 = require("../crypto/core/primitives");
8
+ const random_1 = require("../crypto/core/random");
9
+ const _proto_1 = require("../proto.js");
10
+ const constants_2 = require("../protocol/constants");
11
+ const base64_1 = require("../util/base64");
12
+ const bytes_1 = require("../util/bytes");
13
+ const collections_1 = require("../util/collections");
14
+ const DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE = 256;
15
+ class WaAppStateCrypto {
16
+ constructor(derivedKeysCacheMaxSize = DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE) {
17
+ this.derivedKeysCache = new Map();
18
+ this.derivedKeysCacheMaxSize =
19
+ this.normalizeDerivedKeysCacheMaxSize(derivedKeysCacheMaxSize);
20
+ }
21
+ clearCache() {
22
+ this.derivedKeysCache.clear();
23
+ }
24
+ async deriveKeys(keyData) {
25
+ const cacheKey = (0, base64_1.bytesToBase64)(keyData);
26
+ const cached = this.derivedKeysCache.get(cacheKey);
27
+ if (cached) {
28
+ this.touchDerivedKeysCacheEntry(cacheKey, cached);
29
+ return cached;
30
+ }
31
+ const derived = await (0, hkdf_1.hkdf)(keyData, null, constants_2.WA_APP_STATE_KDF_INFO.MUTATION_KEYS, constants_1.APP_STATE_DERIVED_KEY_LENGTH);
32
+ const keys = {
33
+ indexKey: derived.subarray(0, constants_1.APP_STATE_DERIVED_INDEX_KEY_END),
34
+ valueEncryptionKey: derived.subarray(constants_1.APP_STATE_DERIVED_INDEX_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END),
35
+ valueMacKey: derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END),
36
+ snapshotMacKey: derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END, constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END),
37
+ patchMacKey: derived.subarray(constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END, constants_1.APP_STATE_DERIVED_PATCH_MAC_KEY_END)
38
+ };
39
+ this.touchDerivedKeysCacheEntry(cacheKey, keys);
40
+ return keys;
41
+ }
42
+ async generateIndexMac(indexKey, indexBytes) {
43
+ const key = await (0, primitives_1.importHmacKey)(indexKey);
44
+ return (0, primitives_1.hmacSign)(key, indexBytes);
45
+ }
46
+ async encryptMutation(args) {
47
+ const derivedKeys = await this.deriveKeys(args.keyData);
48
+ const indexBytes = bytes_1.TEXT_ENCODER.encode(args.index);
49
+ const encoded = _proto_1.proto.SyncActionData.encode({
50
+ index: indexBytes,
51
+ value: args.value ?? undefined,
52
+ padding: bytes_1.EMPTY_BYTES,
53
+ version: args.version
54
+ }).finish();
55
+ const iv = args.iv ?? (await (0, random_1.randomBytesAsync)(constants_1.APP_STATE_IV_LENGTH));
56
+ if (iv.byteLength !== constants_1.APP_STATE_IV_LENGTH) {
57
+ throw new Error(`invalid IV length ${iv.byteLength}`);
58
+ }
59
+ const indexMacPromise = this.generateIndexMac(derivedKeys.indexKey, indexBytes);
60
+ const encryptionKey = await (0, primitives_1.importAesCbcKey)(derivedKeys.valueEncryptionKey);
61
+ const cipherText = await (0, primitives_1.aesCbcEncrypt)(encryptionKey, iv, encoded);
62
+ const cipherWithIv = (0, bytes_1.concatBytes)([iv, cipherText]);
63
+ const associatedData = this.generateAssociatedData(args.operation, args.keyId);
64
+ const [valueMac, indexMac] = await Promise.all([
65
+ this.generateValueMac(derivedKeys.valueMacKey, associatedData, cipherWithIv),
66
+ indexMacPromise
67
+ ]);
68
+ return {
69
+ indexMac,
70
+ valueBlob: (0, bytes_1.concatBytes)([cipherWithIv, valueMac]),
71
+ valueMac
72
+ };
73
+ }
74
+ async decryptMutation(args) {
75
+ if (args.valueBlob.byteLength < constants_1.APP_STATE_IV_LENGTH + constants_1.APP_STATE_VALUE_MAC_LENGTH) {
76
+ throw new Error('invalid mutation value blob');
77
+ }
78
+ const derivedKeys = await this.deriveKeys(args.keyData);
79
+ const iv = args.valueBlob.subarray(0, constants_1.APP_STATE_IV_LENGTH);
80
+ const mac = args.valueBlob.subarray(args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
81
+ const cipherText = args.valueBlob.subarray(constants_1.APP_STATE_IV_LENGTH, args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
82
+ const cipherWithIv = args.valueBlob.subarray(0, args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
83
+ const associatedData = this.generateAssociatedData(args.operation, args.keyId);
84
+ const expectedMac = await this.generateValueMac(derivedKeys.valueMacKey, associatedData, cipherWithIv);
85
+ if (!(0, bytes_1.uint8Equal)(mac, expectedMac)) {
86
+ throw new Error('mutation value MAC mismatch');
87
+ }
88
+ const decryptionKey = await (0, primitives_1.importAesCbcKey)(derivedKeys.valueEncryptionKey);
89
+ const plaintext = await (0, primitives_1.aesCbcDecrypt)(decryptionKey, iv, cipherText);
90
+ const syncActionData = _proto_1.proto.SyncActionData.decode(plaintext);
91
+ if (!syncActionData.index) {
92
+ throw new Error('missing sync action index');
93
+ }
94
+ if (syncActionData.version === null || syncActionData.version === undefined) {
95
+ throw new Error('missing sync action version');
96
+ }
97
+ const generatedIndexMac = await this.generateIndexMac(derivedKeys.indexKey, syncActionData.index);
98
+ if (!(0, bytes_1.uint8Equal)(generatedIndexMac, args.indexMac)) {
99
+ throw new Error('mutation index MAC mismatch');
100
+ }
101
+ return {
102
+ index: bytes_1.TEXT_DECODER.decode(syncActionData.index),
103
+ value: syncActionData.value ?? null,
104
+ version: syncActionData.version,
105
+ indexMac: args.indexMac,
106
+ valueMac: mac
107
+ };
108
+ }
109
+ async generateSnapshotMac(keyData, ltHash, version, collectionName) {
110
+ const derivedKeys = await this.deriveKeys(keyData);
111
+ const payload = (0, bytes_1.concatBytes)([
112
+ ltHash,
113
+ (0, utils_1.toNetworkOrder64)(version),
114
+ bytes_1.TEXT_ENCODER.encode(collectionName)
115
+ ]);
116
+ const key = await (0, primitives_1.importHmacKey)(derivedKeys.snapshotMacKey);
117
+ return (0, primitives_1.hmacSign)(key, payload);
118
+ }
119
+ async generatePatchMac(keyData, snapshotMac, valueMacs, version, collectionName) {
120
+ const derivedKeys = await this.deriveKeys(keyData);
121
+ const payload = (0, bytes_1.concatBytes)([
122
+ snapshotMac,
123
+ ...valueMacs,
124
+ (0, utils_1.toNetworkOrder64)(version),
125
+ bytes_1.TEXT_ENCODER.encode(collectionName)
126
+ ]);
127
+ const key = await (0, primitives_1.importHmacKey)(derivedKeys.patchMacKey);
128
+ return (0, primitives_1.hmacSign)(key, payload);
129
+ }
130
+ async ltHashAdd(base, addValues) {
131
+ return this.ltHashApply(base, addValues, (left, right) => left + right);
132
+ }
133
+ async ltHashSubtract(base, removeValues) {
134
+ return this.ltHashApply(base, removeValues, (left, right) => left - right);
135
+ }
136
+ async ltHashSubtractThenAdd(base, addValues, removeValues) {
137
+ const subtractResult = await this.ltHashSubtract(base, removeValues);
138
+ const hash = await this.ltHashAdd(subtractResult, addValues);
139
+ return { hash, subtractResult };
140
+ }
141
+ async ltHashApply(base, values, combine) {
142
+ if (values.length === 0) {
143
+ return base;
144
+ }
145
+ const expandedValues = await Promise.all(values.map((value) => (0, hkdf_1.hkdf)(value, null, constants_2.WA_APP_STATE_KDF_INFO.PATCH_INTEGRITY, constants_1.APP_STATE_EMPTY_LT_HASH.byteLength)));
146
+ const out = new Uint8Array(base.byteLength);
147
+ this.pointwiseWithOverflow(base, expandedValues[0], combine, out);
148
+ for (let index = 1; index < expandedValues.length; index += 1) {
149
+ this.pointwiseWithOverflow(out, expandedValues[index], combine, out);
150
+ }
151
+ return out;
152
+ }
153
+ pointwiseWithOverflow(left, right, combine, out = new Uint8Array(left.byteLength)) {
154
+ if (left.byteLength !== right.byteLength) {
155
+ throw new Error('lt hash input length mismatch');
156
+ }
157
+ if (left.byteLength % constants_1.APP_STATE_POINT_SIZE !== 0) {
158
+ throw new Error('lt hash input alignment mismatch');
159
+ }
160
+ if (out.byteLength !== left.byteLength) {
161
+ throw new Error('lt hash output length mismatch');
162
+ }
163
+ const leftView = new DataView(left.buffer, left.byteOffset, left.byteLength);
164
+ const rightView = new DataView(right.buffer, right.byteOffset, right.byteLength);
165
+ const outView = new DataView(out.buffer, out.byteOffset, out.byteLength);
166
+ for (let offset = 0; offset < left.byteLength; offset += constants_1.APP_STATE_POINT_SIZE) {
167
+ const value = combine(leftView.getUint16(offset, true), rightView.getUint16(offset, true));
168
+ outView.setUint16(offset, value & 0xffff, true);
169
+ }
170
+ return out;
171
+ }
172
+ generateAssociatedData(operation, keyId) {
173
+ if (operation !== _proto_1.proto.SyncdMutation.SyncdOperation.SET &&
174
+ operation !== _proto_1.proto.SyncdMutation.SyncdOperation.REMOVE) {
175
+ throw new Error(`unsupported syncd operation ${operation}`);
176
+ }
177
+ const out = new Uint8Array(1 + keyId.byteLength);
178
+ out[0] = operation + 1;
179
+ out.set(keyId, 1);
180
+ return out;
181
+ }
182
+ async generateValueMac(valueMacKey, associatedData, cipherWithIv) {
183
+ const octetLength = new Uint8Array(constants_1.APP_STATE_MAC_OCTET_LENGTH);
184
+ octetLength[octetLength.length - 1] = associatedData.byteLength & 0xff;
185
+ const key = await (0, primitives_1.importHmacSha512Key)(valueMacKey);
186
+ const full = await (0, primitives_1.hmacSign)(key, (0, bytes_1.concatBytes)([associatedData, cipherWithIv, octetLength]));
187
+ return full.slice(0, constants_1.APP_STATE_VALUE_MAC_LENGTH);
188
+ }
189
+ normalizeDerivedKeysCacheMaxSize(value) {
190
+ if (!Number.isFinite(value)) {
191
+ return DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE;
192
+ }
193
+ return Math.max(0, Math.trunc(value));
194
+ }
195
+ touchDerivedKeysCacheEntry(cacheKey, keys) {
196
+ if (this.derivedKeysCacheMaxSize <= 0) {
197
+ return;
198
+ }
199
+ (0, collections_1.setBoundedMapEntry)(this.derivedKeysCache, cacheKey, keys, this.derivedKeysCacheMaxSize);
200
+ }
201
+ }
202
+ exports.WaAppStateCrypto = WaAppStateCrypto;