zapo-js 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/README.md +12 -7
  2. package/dist/appstate/WaAppStateCrypto.js +18 -25
  3. package/dist/appstate/WaAppStateSyncClient.js +181 -114
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/utils.js +10 -30
  7. package/dist/auth/WaAuthClient.js +48 -55
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
  9. package/dist/auth/index.js +1 -3
  10. package/dist/auth/pairing/WaPairingFlow.js +21 -23
  11. package/dist/auth/pairing/WaQrFlow.js +37 -24
  12. package/dist/client/WaClient.js +103 -276
  13. package/dist/client/WaClientFactory.js +227 -110
  14. package/dist/client/connection/WaConnectionManager.js +292 -0
  15. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  16. package/dist/client/connection/WaReceiptQueue.js +51 -0
  17. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
  21. package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
  22. package/dist/client/dirty.js +35 -29
  23. package/dist/client/events/chat.js +4 -3
  24. package/dist/client/events/group.js +59 -36
  25. package/dist/client/history-sync.js +53 -63
  26. package/dist/client/incoming.js +23 -20
  27. package/dist/client/mailbox.js +8 -8
  28. package/dist/client/messages.js +4 -4
  29. package/dist/client/messaging/fanout.js +189 -0
  30. package/dist/client/messaging/key-protocol.js +130 -0
  31. package/dist/client/messaging/participants.js +191 -0
  32. package/dist/crypto/core/hkdf.js +3 -8
  33. package/dist/crypto/core/index.js +1 -4
  34. package/dist/crypto/core/keys.js +2 -3
  35. package/dist/crypto/core/primitives.js +12 -15
  36. package/dist/crypto/core/random.js +7 -26
  37. package/dist/crypto/curves/Ed25519.js +7 -8
  38. package/dist/crypto/curves/X25519.js +13 -16
  39. package/dist/crypto/index.js +0 -5
  40. package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
  41. package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
  42. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  43. package/dist/esm/appstate/constants.js +3 -2
  44. package/dist/esm/appstate/utils.js +8 -27
  45. package/dist/esm/auth/WaAuthClient.js +48 -55
  46. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
  47. package/dist/esm/auth/index.js +0 -1
  48. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
  49. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  50. package/dist/esm/client/WaClient.js +103 -276
  51. package/dist/esm/client/WaClientFactory.js +227 -110
  52. package/dist/esm/client/connection/WaConnectionManager.js +288 -0
  53. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  54. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  55. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  56. package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
  57. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  58. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
  59. package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
  60. package/dist/esm/client/dirty.js +30 -24
  61. package/dist/esm/client/events/chat.js +4 -3
  62. package/dist/esm/client/events/group.js +50 -28
  63. package/dist/esm/client/history-sync.js +50 -60
  64. package/dist/esm/client/incoming.js +23 -20
  65. package/dist/esm/client/mailbox.js +8 -8
  66. package/dist/esm/client/messages.js +1 -1
  67. package/dist/esm/client/messaging/fanout.js +186 -0
  68. package/dist/esm/client/messaging/key-protocol.js +127 -0
  69. package/dist/esm/client/messaging/participants.js +188 -0
  70. package/dist/esm/crypto/core/hkdf.js +3 -8
  71. package/dist/esm/crypto/core/index.js +0 -1
  72. package/dist/esm/crypto/core/keys.js +2 -3
  73. package/dist/esm/crypto/core/primitives.js +12 -15
  74. package/dist/esm/crypto/core/random.js +6 -25
  75. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  76. package/dist/esm/crypto/curves/X25519.js +10 -13
  77. package/dist/esm/crypto/index.js +0 -2
  78. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  79. package/dist/esm/infra/log/PinoLogger.js +15 -9
  80. package/dist/esm/infra/log/types.js +11 -1
  81. package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
  82. package/dist/esm/media/WaMediaCrypto.js +2 -4
  83. package/dist/esm/media/WaMediaTransferClient.js +226 -58
  84. package/dist/esm/media/conn.js +10 -6
  85. package/dist/esm/media/constants.js +4 -1
  86. package/dist/esm/message/WaMessageClient.js +4 -13
  87. package/dist/esm/message/ack.js +6 -6
  88. package/dist/esm/message/addon-crypto.js +59 -0
  89. package/dist/esm/message/incoming.js +106 -111
  90. package/dist/esm/message/index.js +2 -0
  91. package/dist/esm/message/reporting-token.js +438 -0
  92. package/dist/esm/message/use-case-secret.js +49 -0
  93. package/dist/esm/protocol/appstate.js +58 -0
  94. package/dist/esm/protocol/constants.js +2 -1
  95. package/dist/esm/protocol/index.js +2 -10
  96. package/dist/esm/protocol/jid.js +63 -51
  97. package/dist/esm/protocol/media.js +3 -3
  98. package/dist/esm/protocol/nodes.js +2 -0
  99. package/dist/esm/protocol/usync.js +11 -0
  100. package/dist/esm/retry/index.js +1 -0
  101. package/dist/esm/retry/outbound.js +4 -5
  102. package/dist/esm/retry/parse.js +58 -76
  103. package/dist/esm/retry/replay.js +48 -49
  104. package/dist/esm/retry/tracker.js +56 -0
  105. package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
  106. package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
  107. package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
  108. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
  109. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
  110. package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
  111. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  112. package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
  113. package/dist/esm/signal/group/SenderKeyManager.js +26 -16
  114. package/dist/esm/signal/index.js +1 -0
  115. package/dist/esm/signal/session/SignalProtocol.js +49 -14
  116. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  117. package/dist/esm/signal/session/SignalSession.js +14 -9
  118. package/dist/esm/signal/session/resolver.js +186 -0
  119. package/dist/esm/signal/store/sqlite.js +16 -37
  120. package/dist/esm/store/createStore.js +16 -18
  121. package/dist/esm/store/noop.store.js +3 -6
  122. package/dist/esm/store/providers/memory/appstate.store.js +30 -6
  123. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  124. package/dist/esm/store/providers/memory/device-list.store.js +3 -30
  125. package/dist/esm/store/providers/memory/message.store.js +11 -5
  126. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  127. package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
  128. package/dist/esm/store/providers/memory/signal.store.js +13 -1
  129. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  130. package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
  131. package/dist/esm/store/providers/sqlite/connection.js +18 -13
  132. package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
  133. package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
  134. package/dist/esm/store/providers/sqlite/message.store.js +45 -32
  135. package/dist/esm/store/providers/sqlite/migrations.js +1 -1
  136. package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
  137. package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
  138. package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
  139. package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
  140. package/dist/esm/store/providers/sqlite/table-names.js +107 -0
  141. package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
  142. package/dist/esm/transport/WaComms.js +25 -23
  143. package/dist/esm/transport/WaWebSocket.js +115 -12
  144. package/dist/esm/transport/binary/decoder.js +4 -4
  145. package/dist/esm/transport/binary/encoder.js +12 -4
  146. package/dist/esm/transport/index.js +1 -0
  147. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  148. package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
  149. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  150. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  151. package/dist/esm/transport/node/builders/index.js +2 -1
  152. package/dist/esm/transport/node/builders/message.js +9 -0
  153. package/dist/esm/transport/node/builders/pairing.js +4 -5
  154. package/dist/esm/transport/node/builders/usync.js +41 -0
  155. package/dist/esm/transport/node/helpers.js +107 -5
  156. package/dist/esm/transport/node/usync.js +35 -0
  157. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  158. package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
  159. package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
  160. package/dist/esm/transport/proxy.js +27 -0
  161. package/dist/esm/transport/stream/parse.js +13 -48
  162. package/dist/esm/util/bytes.js +50 -32
  163. package/dist/esm/util/coercion.js +6 -14
  164. package/dist/esm/util/primitives.js +39 -14
  165. package/dist/infra/log/ConsoleLogger.js +18 -17
  166. package/dist/infra/log/PinoLogger.js +15 -9
  167. package/dist/infra/log/types.js +12 -0
  168. package/dist/infra/perf/BoundedTaskQueue.js +13 -17
  169. package/dist/media/WaMediaCrypto.js +1 -3
  170. package/dist/media/WaMediaTransferClient.js +259 -58
  171. package/dist/media/conn.js +10 -6
  172. package/dist/media/constants.js +4 -1
  173. package/dist/message/WaMessageClient.js +5 -14
  174. package/dist/message/ack.js +6 -6
  175. package/dist/message/addon-crypto.js +65 -0
  176. package/dist/message/incoming.js +104 -109
  177. package/dist/message/index.js +2 -0
  178. package/dist/message/reporting-token.js +443 -0
  179. package/dist/message/use-case-secret.js +55 -0
  180. package/dist/protocol/appstate.js +59 -1
  181. package/dist/protocol/constants.js +7 -1
  182. package/dist/protocol/index.js +20 -42
  183. package/dist/protocol/jid.js +64 -51
  184. package/dist/protocol/media.js +3 -3
  185. package/dist/protocol/nodes.js +2 -0
  186. package/dist/protocol/usync.js +14 -0
  187. package/dist/retry/index.js +3 -1
  188. package/dist/retry/outbound.js +6 -7
  189. package/dist/retry/parse.js +57 -75
  190. package/dist/retry/replay.js +46 -47
  191. package/dist/retry/tracker.js +59 -0
  192. package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
  193. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  194. package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
  195. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
  196. package/dist/signal/api/SignalSessionSyncApi.js +23 -30
  197. package/dist/signal/crypto/WaAdvSignature.js +2 -4
  198. package/dist/signal/group/SenderKeyChain.js +27 -22
  199. package/dist/signal/group/SenderKeyCodec.js +1 -3
  200. package/dist/signal/group/SenderKeyManager.js +26 -16
  201. package/dist/signal/index.js +3 -1
  202. package/dist/signal/session/SignalProtocol.js +49 -14
  203. package/dist/signal/session/SignalRatchet.js +24 -15
  204. package/dist/signal/session/SignalSession.js +14 -9
  205. package/dist/signal/session/resolver.js +189 -0
  206. package/dist/signal/store/sqlite.js +16 -37
  207. package/dist/store/createStore.js +16 -18
  208. package/dist/store/noop.store.js +3 -6
  209. package/dist/store/providers/memory/appstate.store.js +28 -4
  210. package/dist/store/providers/memory/contact.store.js +5 -0
  211. package/dist/store/providers/memory/device-list.store.js +3 -30
  212. package/dist/store/providers/memory/message.store.js +11 -5
  213. package/dist/store/providers/memory/participants.store.js +1 -8
  214. package/dist/store/providers/memory/sender-key.store.js +8 -10
  215. package/dist/store/providers/memory/signal.store.js +21 -9
  216. package/dist/store/providers/memory/thread.store.js +5 -0
  217. package/dist/store/providers/sqlite/appstate.store.js +81 -0
  218. package/dist/store/providers/sqlite/connection.js +18 -13
  219. package/dist/store/providers/sqlite/contact.store.js +31 -18
  220. package/dist/store/providers/sqlite/device-list.store.js +7 -35
  221. package/dist/store/providers/sqlite/message.store.js +45 -32
  222. package/dist/store/providers/sqlite/migrations.js +1 -1
  223. package/dist/store/providers/sqlite/participants.store.js +1 -9
  224. package/dist/store/providers/sqlite/retry.store.js +8 -11
  225. package/dist/store/providers/sqlite/sender-key.store.js +24 -29
  226. package/dist/store/providers/sqlite/signal.store.js +105 -23
  227. package/dist/store/providers/sqlite/table-names.js +113 -0
  228. package/dist/store/providers/sqlite/thread.store.js +35 -22
  229. package/dist/transport/WaComms.js +27 -25
  230. package/dist/transport/WaWebSocket.js +148 -12
  231. package/dist/transport/binary/decoder.js +4 -4
  232. package/dist/transport/binary/encoder.js +12 -4
  233. package/dist/transport/index.js +7 -1
  234. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  235. package/dist/transport/node/WaNodeOrchestrator.js +2 -4
  236. package/dist/transport/node/WaNodeTransport.js +0 -3
  237. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  238. package/dist/transport/node/builders/index.js +12 -9
  239. package/dist/transport/node/builders/message.js +9 -0
  240. package/dist/transport/node/builders/pairing.js +4 -5
  241. package/dist/transport/node/builders/usync.js +45 -0
  242. package/dist/transport/node/helpers.js +112 -4
  243. package/dist/transport/node/usync.js +38 -0
  244. package/dist/transport/noise/WaFrameCodec.js +47 -32
  245. package/dist/transport/noise/WaNoiseCert.js +5 -8
  246. package/dist/transport/noise/WaNoiseSession.js +17 -10
  247. package/dist/transport/proxy.js +34 -0
  248. package/dist/transport/stream/parse.js +17 -53
  249. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  250. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  251. package/dist/types/appstate/constants.d.ts +1 -0
  252. package/dist/types/appstate/store/sqlite.d.ts +4 -18
  253. package/dist/types/appstate/utils.d.ts +0 -1
  254. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  255. package/dist/types/auth/index.d.ts +0 -2
  256. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  257. package/dist/types/auth/types.d.ts +6 -9
  258. package/dist/types/client/WaClient.d.ts +27 -25
  259. package/dist/types/client/WaClientFactory.d.ts +22 -23
  260. package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
  261. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  262. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  263. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  264. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
  265. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
  266. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
  267. package/dist/types/client/dirty.d.ts +1 -0
  268. package/dist/types/client/events/group.d.ts +2 -1
  269. package/dist/types/client/index.d.ts +1 -1
  270. package/dist/types/client/messaging/fanout.d.ts +14 -0
  271. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  272. package/dist/types/client/messaging/participants.d.ts +13 -0
  273. package/dist/types/client/types.d.ts +24 -1
  274. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  275. package/dist/types/crypto/core/index.d.ts +0 -1
  276. package/dist/types/crypto/core/random.d.ts +1 -7
  277. package/dist/types/crypto/index.d.ts +0 -2
  278. package/dist/types/index.d.ts +1 -1
  279. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  280. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  281. package/dist/types/infra/log/types.d.ts +1 -0
  282. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  283. package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
  284. package/dist/types/media/types.d.ts +5 -0
  285. package/dist/types/message/addon-crypto.d.ts +25 -0
  286. package/dist/types/message/index.d.ts +2 -0
  287. package/dist/types/message/reporting-token.d.ts +19 -0
  288. package/dist/types/message/use-case-secret.d.ts +20 -0
  289. package/dist/types/protocol/appstate.d.ts +58 -0
  290. package/dist/types/protocol/constants.d.ts +2 -1
  291. package/dist/types/protocol/index.d.ts +2 -10
  292. package/dist/types/protocol/jid.d.ts +3 -3
  293. package/dist/types/protocol/nodes.d.ts +2 -0
  294. package/dist/types/protocol/usync.d.ts +11 -0
  295. package/dist/types/retry/index.d.ts +1 -0
  296. package/dist/types/retry/replay.d.ts +0 -4
  297. package/dist/types/retry/tracker.d.ts +19 -0
  298. package/dist/types/retry/types.d.ts +4 -3
  299. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
  300. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  301. package/dist/types/signal/index.d.ts +1 -0
  302. package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
  303. package/dist/types/signal/session/resolver.d.ts +17 -0
  304. package/dist/types/store/contracts/appstate.store.d.ts +3 -0
  305. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  306. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  307. package/dist/types/store/contracts/message.store.d.ts +1 -0
  308. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  309. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  310. package/dist/types/store/contracts/signal.store.d.ts +6 -0
  311. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  312. package/dist/types/store/index.d.ts +1 -1
  313. package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
  314. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  315. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  316. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  317. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  318. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  319. package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
  320. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  321. package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
  322. package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
  323. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
  324. package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
  325. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
  326. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
  327. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
  328. package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
  329. package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
  330. package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
  331. package/dist/types/store/types.d.ts +3 -0
  332. package/dist/types/transport/WaWebSocket.d.ts +3 -0
  333. package/dist/types/transport/index.d.ts +2 -1
  334. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  335. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  336. package/dist/types/transport/node/builders/group.d.ts +4 -6
  337. package/dist/types/transport/node/builders/index.d.ts +2 -1
  338. package/dist/types/transport/node/builders/message.d.ts +14 -25
  339. package/dist/types/transport/node/builders/retry.d.ts +2 -4
  340. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  341. package/dist/types/transport/node/helpers.d.ts +8 -0
  342. package/dist/types/transport/node/usync.d.ts +2 -0
  343. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  344. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
  345. package/dist/types/transport/proxy.d.ts +6 -0
  346. package/dist/types/transport/stream/parse.d.ts +0 -1
  347. package/dist/types/transport/types.d.ts +18 -1
  348. package/dist/types/util/bytes.d.ts +5 -0
  349. package/dist/types/util/primitives.d.ts +3 -0
  350. package/dist/util/bytes.js +55 -33
  351. package/dist/util/coercion.js +6 -14
  352. package/dist/util/primitives.js +42 -14
  353. package/package.json +27 -9
  354. package/proto/index.d.ts +1090 -1048
  355. package/proto/index.js +1 -1
  356. package/scripts/check-node-version.cjs +0 -1
  357. package/dist/crypto/core/encoding.js +0 -29
  358. package/dist/esm/crypto/core/encoding.js +0 -25
  359. package/dist/esm/util/base64.js +0 -18
  360. package/dist/esm/util/signal-address.js +0 -5
  361. package/dist/types/crypto/core/encoding.d.ts +0 -11
  362. package/dist/types/util/base64.d.ts +0 -4
  363. package/dist/types/util/signal-address.d.ts +0 -2
  364. package/dist/util/base64.js +0 -24
  365. package/dist/util/signal-address.js +0 -8
  366. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -1,4 +1,5 @@
1
1
  import { SERIALIZED_PUB_KEY_PREFIX } from '../core/constants.js';
2
+ import { assertByteLength } from '../../util/bytes.js';
2
3
  /**
3
4
  * Converts a 32-byte raw public key to 33-byte serialized format (with 0x05 prefix)
4
5
  */
@@ -9,9 +10,7 @@ export function toSerializedPubKey(key) {
9
10
  }
10
11
  return key;
11
12
  }
12
- if (key.length !== 32) {
13
- throw new Error(`invalid signal public key length ${key.length}`);
14
- }
13
+ assertByteLength(key, 32, `invalid signal public key length ${key.length}`);
15
14
  const out = new Uint8Array(33);
16
15
  out[0] = SERIALIZED_PUB_KEY_PREFIX;
17
16
  out.set(key, 1);
@@ -3,17 +3,20 @@
3
3
  */
4
4
  import { createHash, webcrypto } from 'node:crypto';
5
5
  import { EMPTY_BYTES, toBytesView } from '../../util/bytes.js';
6
+ async function digestBytes(algorithm, value) {
7
+ return toBytesView(await webcrypto.subtle.digest(algorithm, value));
8
+ }
6
9
  // ============================================
7
10
  // Hash functions
8
11
  // ============================================
9
12
  export async function sha256(value) {
10
- return toBytesView(await webcrypto.subtle.digest('SHA-256', value));
13
+ return digestBytes('SHA-256', value);
11
14
  }
12
15
  export async function sha1(value) {
13
- return toBytesView(await webcrypto.subtle.digest('SHA-1', value));
16
+ return digestBytes('SHA-1', value);
14
17
  }
15
18
  export async function sha512(value) {
16
- return toBytesView(await webcrypto.subtle.digest('SHA-512', value));
19
+ return digestBytes('SHA-512', value);
17
20
  }
18
21
  export function md5Bytes(input) {
19
22
  return toBytesView(createHash('md5').update(input).digest());
@@ -25,12 +28,10 @@ export async function importAesGcmKey(raw, usages) {
25
28
  return webcrypto.subtle.importKey('raw', raw, 'AES-GCM', false, usages);
26
29
  }
27
30
  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);
31
+ return toBytesView(await webcrypto.subtle.encrypt({ name: 'AES-GCM', iv: nonce, additionalData: aad }, key, plaintext));
30
32
  }
31
33
  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
+ return toBytesView(await webcrypto.subtle.decrypt({ name: 'AES-GCM', iv: nonce, additionalData: aad }, key, ciphertext));
34
35
  }
35
36
  // ============================================
36
37
  // AES-CBC (for Signal protocol)
@@ -42,12 +43,10 @@ export async function importAesCbcKey(keyBytes) {
42
43
  ]);
43
44
  }
44
45
  export async function aesCbcEncrypt(key, iv, plaintext) {
45
- const result = await webcrypto.subtle.encrypt({ name: 'AES-CBC', iv }, key, plaintext);
46
- return toBytesView(result);
46
+ return toBytesView(await webcrypto.subtle.encrypt({ name: 'AES-CBC', iv }, key, plaintext));
47
47
  }
48
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);
49
+ return toBytesView(await webcrypto.subtle.decrypt({ name: 'AES-CBC', iv }, key, ciphertext));
51
50
  }
52
51
  // ============================================
53
52
  // HMAC-SHA256 (for Signal protocol)
@@ -86,12 +85,10 @@ export async function pbkdf2DeriveAesCtrKey(password, salt, iterations) {
86
85
  // AES-CTR (for pairing code crypto)
87
86
  // ============================================
88
87
  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);
88
+ return toBytesView(await webcrypto.subtle.encrypt({ name: 'AES-CTR', counter, length: 64 }, key, plaintext));
91
89
  }
92
90
  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);
91
+ return toBytesView(await webcrypto.subtle.decrypt({ name: 'AES-CTR', counter, length: 64 }, key, ciphertext));
95
92
  }
96
93
  // ============================================
97
94
  // Ed25519 raw verify (for Signal variant sigs)
@@ -1,28 +1,9 @@
1
1
  import { randomBytes, randomInt } from 'node:crypto';
2
+ import { promisify } from 'node:util';
2
3
  import { toBytesView } from '../../util/bytes.js';
3
- /**
4
- * Generates cryptographically secure random bytes
5
- */
6
- export function randomBytesAsync(size) {
7
- return new Promise((resolve, reject) => {
8
- randomBytes(size, (error, buffer) => {
9
- if (error)
10
- reject(error);
11
- else
12
- resolve(toBytesView(buffer));
13
- });
14
- });
15
- }
16
- /**
17
- * Generates a cryptographically secure random integer in the range [min, max)
18
- */
19
- export function randomIntAsync(min, max) {
20
- return new Promise((resolve, reject) => {
21
- randomInt(min, max, (error, value) => {
22
- if (error)
23
- reject(error);
24
- else
25
- resolve(value);
26
- });
27
- });
4
+ const randomBytesAsyncImpl = promisify(randomBytes);
5
+ const randomIntAsyncImpl = promisify(randomInt);
6
+ export async function randomBytesAsync(size) {
7
+ return toBytesView(await randomBytesAsyncImpl(size));
28
8
  }
9
+ export const randomIntAsync = randomIntAsyncImpl;
@@ -1,8 +1,7 @@
1
1
  import { webcrypto } from 'node:crypto';
2
- import { assert32, decodeBase64Url } from '../core/encoding.js';
3
2
  import { ED25519_PKCS8_PREFIX } from '../curves/constants.js';
4
3
  import { pkcs8FromRawPrivate } from '../curves/types.js';
5
- import { toBytesView } from '../../util/bytes.js';
4
+ import { assertByteLength, decodeBase64Url, toBytesView } from '../../util/bytes.js';
6
5
  export class Ed25519 {
7
6
  static async generateKeyPair() {
8
7
  const keys = (await webcrypto.subtle.generateKey({ name: 'Ed25519' }, true, [
@@ -16,7 +15,7 @@ export class Ed25519 {
16
15
  };
17
16
  }
18
17
  static async keyPairFromPrivateKey(privKey) {
19
- assert32(privKey, 'ed25519 private key');
18
+ assertByteLength(privKey, 32, 'ed25519 private key must be 32 bytes');
20
19
  const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(ED25519_PKCS8_PREFIX, privKey), { name: 'Ed25519' }, true, ['sign']);
21
20
  const privateJwk = await webcrypto.subtle.exportKey('jwk', privateKey);
22
21
  return {
@@ -25,13 +24,13 @@ export class Ed25519 {
25
24
  };
26
25
  }
27
26
  static async sign(message, privKey) {
28
- assert32(privKey, 'ed25519 private key');
27
+ assertByteLength(privKey, 32, 'ed25519 private key must be 32 bytes');
29
28
  const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(ED25519_PKCS8_PREFIX, privKey), { name: 'Ed25519' }, false, ['sign']);
30
29
  const signature = await webcrypto.subtle.sign('Ed25519', privateKey, message);
31
30
  return toBytesView(signature);
32
31
  }
33
32
  static async verify(message, signature, pubKey) {
34
- assert32(pubKey, 'ed25519 public key');
33
+ assertByteLength(pubKey, 32, 'ed25519 public key must be 32 bytes');
35
34
  const publicKey = await webcrypto.subtle.importKey('raw', pubKey, { name: 'Ed25519' }, false, ['verify']);
36
35
  return webcrypto.subtle.verify('Ed25519', publicKey, signature, message);
37
36
  }
@@ -1,23 +1,18 @@
1
1
  import { webcrypto } from 'node:crypto';
2
- import { assert32, decodeBase64Url } from '../core/encoding.js';
3
2
  import { X25519_PKCS8_PREFIX } from '../curves/constants.js';
4
3
  import { pkcs8FromRawPrivate } from '../curves/types.js';
5
4
  import { bigIntToBytesLE, bytesToBigIntLE } from '../math/le.js';
6
5
  import { FIELD_P, mod, modInv } from '../math/mod.js';
7
- import { toBytesView } from '../../util/bytes.js';
6
+ import { assertByteLength, decodeBase64Url, toBytesView } from '../../util/bytes.js';
8
7
  export function clampCurvePrivateKeyInPlace(privateKey) {
9
- if (privateKey.length !== 32) {
10
- throw new Error(`invalid curve25519 private key length ${privateKey.length}`);
11
- }
8
+ assertByteLength(privateKey, 32, `invalid curve25519 private key length ${privateKey.length}`);
12
9
  privateKey[0] &= 248;
13
10
  privateKey[31] &= 127;
14
11
  privateKey[31] |= 64;
15
12
  return privateKey;
16
13
  }
17
14
  export function montgomeryToEdwardsPublic(curvePublicKey, signBit) {
18
- if (curvePublicKey.length !== 32) {
19
- throw new Error(`invalid curve25519 public key length ${curvePublicKey.length}`);
20
- }
15
+ assertByteLength(curvePublicKey, 32, `invalid curve25519 public key length ${curvePublicKey.length}`);
21
16
  const x = bytesToBigIntLE(curvePublicKey);
22
17
  if (x === FIELD_P - 1n) {
23
18
  throw new Error('invalid curve25519 low-order public key');
@@ -39,7 +34,7 @@ export class X25519 {
39
34
  };
40
35
  }
41
36
  static async keyPairFromPrivateKey(privKey) {
42
- assert32(privKey, 'x25519 private key');
37
+ assertByteLength(privKey, 32, 'x25519 private key must be 32 bytes');
43
38
  const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(X25519_PKCS8_PREFIX, privKey), { name: 'X25519' }, true, ['deriveBits']);
44
39
  const privateJwk = await webcrypto.subtle.exportKey('jwk', privateKey);
45
40
  return {
@@ -48,10 +43,12 @@ export class X25519 {
48
43
  };
49
44
  }
50
45
  static async scalarMult(privKey, pubKey) {
51
- assert32(privKey, 'x25519 private key');
52
- assert32(pubKey, 'x25519 public key');
53
- const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(X25519_PKCS8_PREFIX, privKey), { name: 'X25519' }, false, ['deriveBits']);
54
- const publicKey = await webcrypto.subtle.importKey('raw', pubKey, { name: 'X25519' }, false, []);
46
+ assertByteLength(privKey, 32, 'x25519 private key must be 32 bytes');
47
+ assertByteLength(pubKey, 32, 'x25519 public key must be 32 bytes');
48
+ const [privateKey, publicKey] = await Promise.all([
49
+ webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(X25519_PKCS8_PREFIX, privKey), { name: 'X25519' }, false, ['deriveBits']),
50
+ webcrypto.subtle.importKey('raw', pubKey, { name: 'X25519' }, false, [])
51
+ ]);
55
52
  const sharedBits = await webcrypto.subtle.deriveBits({ name: 'X25519', public: publicKey }, privateKey, 256);
56
53
  return toBytesView(sharedBits);
57
54
  }
@@ -1,3 +1 @@
1
1
  export * from './core/index.js';
2
- export { Ed25519 } from './curves/Ed25519.js';
3
- export { X25519 } from './curves/X25519.js';
@@ -5,36 +5,37 @@ const LOG_LEVEL_PRIORITY = {
5
5
  warn: 40,
6
6
  error: 50
7
7
  };
8
+ const CONSOLE_WRITERS = {
9
+ trace: console.debug,
10
+ debug: console.debug,
11
+ info: console.info,
12
+ warn: console.warn,
13
+ error: console.error
14
+ };
8
15
  export class ConsoleLogger {
9
16
  constructor(level = 'info') {
10
17
  this.level = level;
18
+ this.minLevelPriority = LOG_LEVEL_PRIORITY[level];
11
19
  }
12
20
  trace(message, context) {
13
- if (this.canLog('trace')) {
14
- console.debug(message, context);
15
- }
21
+ this.write('trace', message, context);
16
22
  }
17
23
  debug(message, context) {
18
- if (this.canLog('debug')) {
19
- console.debug(message, context);
20
- }
24
+ this.write('debug', message, context);
21
25
  }
22
26
  info(message, context) {
23
- if (this.canLog('info')) {
24
- console.info(message, context);
25
- }
27
+ this.write('info', message, context);
26
28
  }
27
29
  warn(message, context) {
28
- if (this.canLog('warn')) {
29
- console.warn(message, context);
30
- }
30
+ this.write('warn', message, context);
31
31
  }
32
32
  error(message, context) {
33
- if (this.canLog('error')) {
34
- console.error(message, context);
35
- }
33
+ this.write('error', message, context);
36
34
  }
37
- canLog(level) {
38
- return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[this.level];
35
+ write(level, message, context) {
36
+ if (LOG_LEVEL_PRIORITY[level] < this.minLevelPriority) {
37
+ return;
38
+ }
39
+ CONSOLE_WRITERS[level](message, context);
39
40
  }
40
41
  }
@@ -23,26 +23,32 @@ export class PinoLogger {
23
23
  this.logger.level = level;
24
24
  }
25
25
  trace(message, context) {
26
- this.writeLog('trace', message, context);
26
+ this.write('trace', message, context);
27
27
  }
28
28
  debug(message, context) {
29
- this.writeLog('debug', message, context);
29
+ this.write('debug', message, context);
30
30
  }
31
31
  info(message, context) {
32
- this.writeLog('info', message, context);
32
+ this.write('info', message, context);
33
33
  }
34
34
  warn(message, context) {
35
- this.writeLog('warn', message, context);
35
+ this.write('warn', message, context);
36
36
  }
37
37
  error(message, context) {
38
- this.writeLog('error', message, context);
38
+ this.write('error', message, context);
39
39
  }
40
- writeLog(method, message, context) {
41
- if (!context || Object.keys(context).length === 0) {
42
- this.logger[method](message);
40
+ write(level, message, context) {
41
+ if (context === null || context === undefined) {
42
+ this.logger[level](message);
43
43
  return;
44
44
  }
45
- this.logger[method](context, message);
45
+ for (const key in context) {
46
+ if (Object.prototype.hasOwnProperty.call(context, key)) {
47
+ this.logger[level](context, message);
48
+ return;
49
+ }
50
+ }
51
+ this.logger[level](message);
46
52
  }
47
53
  }
48
54
  export async function createPinoLogger(options = {}) {
@@ -1 +1,11 @@
1
- export {};
1
+ function noop() { }
2
+ export function createNoopLogger(level = 'trace') {
3
+ return {
4
+ level,
5
+ trace: noop,
6
+ debug: noop,
7
+ info: noop,
8
+ warn: noop,
9
+ error: noop
10
+ };
11
+ }
@@ -7,6 +7,16 @@ export class BoundedTaskQueueFullError extends Error {
7
7
  }
8
8
  export class BoundedTaskQueue {
9
9
  constructor(maxQueueSize = 256, maxConcurrency = 1) {
10
+ this.settleTask = () => {
11
+ this.running--;
12
+ if (this.head >= 1024 && this.head * 2 >= this.queue.length) {
13
+ const remaining = this.queue.length - this.head;
14
+ this.queue.copyWithin(0, this.head);
15
+ this.queue.length = remaining;
16
+ this.head = 0;
17
+ }
18
+ this.drain();
19
+ };
10
20
  if (maxQueueSize <= 0) {
11
21
  throw new Error('maxQueueSize must be > 0');
12
22
  }
@@ -25,8 +35,8 @@ export class BoundedTaskQueue {
25
35
  }
26
36
  return new Promise((resolve, reject) => {
27
37
  this.queue.push({
28
- task,
29
- resolve: (value) => resolve(value),
38
+ task: task,
39
+ resolve: resolve,
30
40
  reject
31
41
  });
32
42
  this.drain();
@@ -42,21 +52,7 @@ export class BoundedTaskQueue {
42
52
  while (this.running < this.maxConcurrency && this.head < this.queue.length) {
43
53
  const item = this.queue[this.head++];
44
54
  this.running++;
45
- item.task()
46
- .then(item.resolve)
47
- .catch(item.reject)
48
- .finally(() => {
49
- this.running--;
50
- this.compactIfNeeded();
51
- this.drain();
52
- });
55
+ void item.task().then(item.resolve, item.reject).finally(this.settleTask);
53
56
  }
54
57
  }
55
- compactIfNeeded() {
56
- if (this.head < 1024 || this.head * 2 < this.queue.length) {
57
- return;
58
- }
59
- this.queue.splice(0, this.head);
60
- this.head = 0;
61
- }
62
58
  }
@@ -6,16 +6,14 @@ import { aesCbcDecrypt, aesCbcEncrypt, hmacSign, importAesCbcKey, importHmacKey,
6
6
  import { randomBytesAsync } from '../crypto/core/random.js';
7
7
  import { ENC_KEY_END, ENC_KEY_START, HMAC_TRUNCATED_SIZE, IV_SIZE, MAC_KEY_END, MAC_KEY_START, MEDIA_HKDF_SIZE } from './constants.js';
8
8
  import { WA_APP_STATE_KEY_TYPES, getWaMediaHkdfInfo } from '../protocol/constants.js';
9
- import { concatBytes, EMPTY_BYTES, readAllBytes, toChunkBytes, toBytesView, uint8Equal, uint8TimingSafeEqual } from '../util/bytes.js';
9
+ import { assertByteLength, concatBytes, EMPTY_BYTES, readAllBytes, toChunkBytes, toBytesView, uint8Equal, uint8TimingSafeEqual } from '../util/bytes.js';
10
10
  import { toError } from '../util/primitives.js';
11
11
  export class WaMediaCrypto {
12
12
  static async generateMediaKey() {
13
13
  return randomBytesAsync(32);
14
14
  }
15
15
  static async deriveKeys(mediaType, mediaKey) {
16
- if (mediaKey.byteLength !== 32) {
17
- throw new Error(`invalid media key length ${mediaKey.byteLength}, expected 32`);
18
- }
16
+ assertByteLength(mediaKey, 32, `invalid media key length ${mediaKey.byteLength}, expected 32`);
19
17
  const info = mediaTypeToHkdfInfo(mediaType);
20
18
  const expanded = await hkdf(mediaKey, null, info, MEDIA_HKDF_SIZE);
21
19
  return {