zapo-js 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/README.md +20 -4
  2. package/dist/appstate/WaAppStateCrypto.js +19 -26
  3. package/dist/appstate/WaAppStateSyncClient.js +293 -181
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  7. package/dist/appstate/index.js +8 -6
  8. package/dist/appstate/utils.js +9 -34
  9. package/dist/auth/WaAuthClient.js +43 -61
  10. package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
  11. package/dist/auth/index.js +1 -8
  12. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  13. package/dist/auth/pairing/WaPairingFlow.js +34 -26
  14. package/dist/auth/pairing/WaQrFlow.js +37 -24
  15. package/dist/client/WaClient.js +275 -324
  16. package/dist/client/WaClientFactory.js +500 -133
  17. package/dist/client/connection/WaConnectionManager.js +301 -0
  18. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  19. package/dist/client/connection/WaReceiptQueue.js +51 -0
  20. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  22. package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
  23. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  24. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
  25. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  26. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  27. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  28. package/dist/client/coordinators/WaRetryCoordinator.js +242 -57
  29. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  30. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  31. package/dist/client/dirty.js +74 -48
  32. package/dist/client/events/chat.js +4 -3
  33. package/dist/client/events/devices.js +72 -0
  34. package/dist/client/events/group.js +62 -47
  35. package/dist/client/events/identity.js +22 -0
  36. package/dist/client/events/privacy-token.js +39 -0
  37. package/dist/client/history-sync.js +94 -63
  38. package/dist/client/incoming.js +60 -27
  39. package/dist/client/mailbox.js +24 -23
  40. package/dist/client/messages.js +107 -31
  41. package/dist/client/messaging/fanout.js +199 -0
  42. package/dist/client/messaging/key-protocol.js +130 -0
  43. package/dist/client/messaging/participants.js +193 -0
  44. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  45. package/dist/client/tokens/cs-token.js +50 -0
  46. package/dist/client/tokens/tc-token.js +25 -0
  47. package/dist/crypto/core/hkdf.js +3 -8
  48. package/dist/crypto/core/index.js +2 -5
  49. package/dist/crypto/core/keys.js +6 -7
  50. package/dist/crypto/core/nonce.js +2 -0
  51. package/dist/crypto/core/primitives.js +12 -23
  52. package/dist/crypto/core/random.js +26 -23
  53. package/dist/crypto/curves/Ed25519.js +7 -8
  54. package/dist/crypto/curves/X25519.js +38 -22
  55. package/dist/crypto/index.js +1 -3
  56. package/dist/crypto/math/constants.js +13 -36
  57. package/dist/crypto/math/edwards.js +171 -44
  58. package/dist/crypto/math/fe.js +706 -0
  59. package/dist/crypto/math/mod.js +10 -3
  60. package/dist/esm/appstate/WaAppStateCrypto.js +7 -14
  61. package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
  62. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  63. package/dist/esm/appstate/constants.js +3 -2
  64. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  65. package/dist/esm/appstate/index.js +2 -2
  66. package/dist/esm/appstate/utils.js +8 -30
  67. package/dist/esm/auth/WaAuthClient.js +43 -61
  68. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
  69. package/dist/esm/auth/index.js +0 -3
  70. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  71. package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
  72. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  73. package/dist/esm/client/WaClient.js +275 -324
  74. package/dist/esm/client/WaClientFactory.js +501 -134
  75. package/dist/esm/client/connection/WaConnectionManager.js +297 -0
  76. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  77. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  78. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  79. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  80. package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
  81. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  82. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
  83. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  84. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  85. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  86. package/dist/esm/client/coordinators/WaRetryCoordinator.js +244 -59
  87. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  88. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  89. package/dist/esm/client/dirty.js +69 -43
  90. package/dist/esm/client/events/chat.js +4 -3
  91. package/dist/esm/client/events/devices.js +68 -0
  92. package/dist/esm/client/events/group.js +53 -39
  93. package/dist/esm/client/events/identity.js +19 -0
  94. package/dist/esm/client/events/privacy-token.js +36 -0
  95. package/dist/esm/client/history-sync.js +91 -60
  96. package/dist/esm/client/incoming.js +61 -28
  97. package/dist/esm/client/mailbox.js +24 -23
  98. package/dist/esm/client/messages.js +108 -32
  99. package/dist/esm/client/messaging/fanout.js +196 -0
  100. package/dist/esm/client/messaging/key-protocol.js +127 -0
  101. package/dist/esm/client/messaging/participants.js +190 -0
  102. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  103. package/dist/esm/client/tokens/cs-token.js +46 -0
  104. package/dist/esm/client/tokens/tc-token.js +18 -0
  105. package/dist/esm/crypto/core/hkdf.js +3 -8
  106. package/dist/esm/crypto/core/index.js +2 -3
  107. package/dist/esm/crypto/core/keys.js +3 -4
  108. package/dist/esm/crypto/core/nonce.js +2 -0
  109. package/dist/esm/crypto/core/primitives.js +12 -22
  110. package/dist/esm/crypto/core/random.js +25 -23
  111. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  112. package/dist/esm/crypto/curves/X25519.js +35 -19
  113. package/dist/esm/crypto/index.js +0 -1
  114. package/dist/esm/crypto/math/constants.js +12 -35
  115. package/dist/esm/crypto/math/edwards.js +174 -47
  116. package/dist/esm/crypto/math/fe.js +691 -0
  117. package/dist/esm/crypto/math/mod.js +10 -1
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  120. package/dist/esm/infra/log/PinoLogger.js +15 -9
  121. package/dist/esm/infra/log/types.js +11 -1
  122. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  123. package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
  124. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  125. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  126. package/dist/esm/infra/perf/StoreLock.js +77 -0
  127. package/dist/esm/media/WaMediaCrypto.js +96 -16
  128. package/dist/esm/media/WaMediaTransferClient.js +251 -91
  129. package/dist/esm/media/conn.js +10 -6
  130. package/dist/esm/media/constants.js +6 -2
  131. package/dist/esm/message/WaMessageClient.js +30 -32
  132. package/dist/esm/message/ack.js +6 -6
  133. package/dist/esm/message/addon-crypto.js +59 -0
  134. package/dist/esm/message/content.js +195 -9
  135. package/dist/esm/message/icdc.js +76 -0
  136. package/dist/esm/message/incoming.js +129 -122
  137. package/dist/esm/message/index.js +2 -0
  138. package/dist/esm/message/phash.js +3 -1
  139. package/dist/esm/message/reporting-token.js +425 -0
  140. package/dist/esm/message/use-case-secret.js +49 -0
  141. package/dist/esm/protocol/appstate.js +27 -0
  142. package/dist/esm/protocol/browser.js +10 -18
  143. package/dist/esm/protocol/constants.js +6 -3
  144. package/dist/esm/protocol/defaults.js +6 -0
  145. package/dist/esm/protocol/index.js +2 -11
  146. package/dist/esm/protocol/jid.js +133 -52
  147. package/dist/esm/protocol/media.js +3 -3
  148. package/dist/esm/protocol/message.js +61 -1
  149. package/dist/esm/protocol/nodes.js +4 -0
  150. package/dist/esm/protocol/notification.js +3 -1
  151. package/dist/esm/protocol/privacy-token.js +17 -0
  152. package/dist/esm/protocol/privacy.js +55 -0
  153. package/dist/esm/protocol/stream.js +26 -1
  154. package/dist/esm/protocol/usync.js +11 -0
  155. package/dist/esm/retry/codec.js +216 -0
  156. package/dist/esm/retry/constants.js +1 -1
  157. package/dist/esm/retry/index.js +3 -2
  158. package/dist/esm/retry/parse.js +88 -86
  159. package/dist/esm/retry/replay.js +54 -51
  160. package/dist/esm/retry/tracker.js +94 -0
  161. package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
  162. package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
  163. package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
  164. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
  165. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  166. package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
  167. package/dist/esm/signal/api/result-map.js +10 -0
  168. package/dist/esm/signal/constants.js +0 -4
  169. package/dist/esm/signal/crypto/WaAdvSignature.js +13 -9
  170. package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
  171. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  172. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  173. package/dist/esm/signal/group/SenderKeyManager.js +144 -115
  174. package/dist/esm/signal/index.js +2 -0
  175. package/dist/esm/signal/registration/keygen.js +6 -2
  176. package/dist/esm/signal/registration/utils.js +1 -0
  177. package/dist/esm/signal/session/SignalProtocol.js +164 -53
  178. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  179. package/dist/esm/signal/session/SignalSession.js +14 -9
  180. package/dist/esm/signal/session/resolver.js +221 -0
  181. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  182. package/dist/esm/store/createStore.js +100 -188
  183. package/dist/esm/store/index.js +1 -10
  184. package/dist/esm/store/locks/appstate.lock.js +26 -0
  185. package/dist/esm/store/locks/auth.lock.js +15 -0
  186. package/dist/esm/store/locks/contact.lock.js +20 -0
  187. package/dist/esm/store/locks/device-list.lock.js +20 -0
  188. package/dist/esm/store/locks/message.lock.js +21 -0
  189. package/dist/esm/store/locks/participants.lock.js +20 -0
  190. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  191. package/dist/esm/store/locks/retry.lock.js +29 -0
  192. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  193. package/dist/esm/store/locks/signal.lock.js +63 -0
  194. package/dist/esm/store/locks/thread.lock.js +21 -0
  195. package/dist/esm/store/noop.store.js +4 -7
  196. package/dist/esm/store/providers/memory/appstate.store.js +38 -16
  197. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  198. package/dist/esm/store/providers/memory/device-list.store.js +12 -34
  199. package/dist/esm/store/providers/memory/message.store.js +11 -5
  200. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  201. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  202. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  203. package/dist/esm/store/providers/memory/sender-key.store.js +11 -8
  204. package/dist/esm/store/providers/memory/signal.store.js +47 -18
  205. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  206. package/dist/esm/transport/WaComms.js +28 -24
  207. package/dist/esm/transport/WaWebSocket.js +115 -18
  208. package/dist/esm/transport/binary/constants.js +0 -30
  209. package/dist/esm/transport/binary/decoder.js +8 -8
  210. package/dist/esm/transport/binary/encoder.js +10 -9
  211. package/dist/esm/transport/binary/index.js +0 -1
  212. package/dist/esm/transport/index.js +1 -0
  213. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  214. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
  215. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  216. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  217. package/dist/esm/transport/node/builders/business.js +129 -0
  218. package/dist/esm/transport/node/builders/global.js +370 -0
  219. package/dist/esm/transport/node/builders/index.js +7 -3
  220. package/dist/esm/transport/node/builders/message.js +63 -230
  221. package/dist/esm/transport/node/builders/pairing.js +2 -27
  222. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  223. package/dist/esm/transport/node/builders/privacy.js +48 -0
  224. package/dist/esm/transport/node/builders/profile.js +70 -0
  225. package/dist/esm/transport/node/builders/retry.js +10 -22
  226. package/dist/esm/transport/node/builders/usync.js +45 -0
  227. package/dist/esm/transport/node/helpers.js +125 -5
  228. package/dist/esm/transport/node/usync.js +5 -0
  229. package/dist/esm/transport/node/xml.js +35 -14
  230. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  231. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  232. package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
  233. package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
  234. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  235. package/dist/esm/transport/proxy.js +27 -0
  236. package/dist/esm/transport/stream/parse.js +17 -48
  237. package/dist/esm/util/bytes.js +67 -45
  238. package/dist/esm/util/coercion.js +6 -14
  239. package/dist/esm/util/index.js +5 -0
  240. package/dist/esm/util/primitives.js +40 -14
  241. package/dist/index.js +7 -1
  242. package/dist/infra/log/ConsoleLogger.js +18 -17
  243. package/dist/infra/log/PinoLogger.js +15 -9
  244. package/dist/infra/log/types.js +12 -0
  245. package/dist/infra/perf/BackgroundQueue.js +482 -0
  246. package/dist/infra/perf/BoundedTaskQueue.js +16 -18
  247. package/dist/infra/perf/PromiseDedup.js +24 -0
  248. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  249. package/dist/infra/perf/StoreLock.js +81 -0
  250. package/dist/media/WaMediaCrypto.js +95 -15
  251. package/dist/media/WaMediaTransferClient.js +284 -91
  252. package/dist/media/conn.js +10 -6
  253. package/dist/media/constants.js +6 -2
  254. package/dist/message/WaMessageClient.js +31 -33
  255. package/dist/message/ack.js +6 -6
  256. package/dist/message/addon-crypto.js +65 -0
  257. package/dist/message/content.js +198 -9
  258. package/dist/message/icdc.js +81 -0
  259. package/dist/message/incoming.js +127 -120
  260. package/dist/message/index.js +2 -0
  261. package/dist/message/phash.js +3 -1
  262. package/dist/message/reporting-token.js +429 -0
  263. package/dist/message/use-case-secret.js +55 -0
  264. package/dist/protocol/appstate.js +28 -1
  265. package/dist/protocol/browser.js +10 -18
  266. package/dist/protocol/constants.js +26 -1
  267. package/dist/protocol/defaults.js +6 -0
  268. package/dist/protocol/index.js +23 -42
  269. package/dist/protocol/jid.js +140 -52
  270. package/dist/protocol/media.js +3 -3
  271. package/dist/protocol/message.js +62 -2
  272. package/dist/protocol/nodes.js +4 -0
  273. package/dist/protocol/notification.js +3 -1
  274. package/dist/protocol/privacy-token.js +20 -0
  275. package/dist/protocol/privacy.js +58 -0
  276. package/dist/protocol/stream.js +27 -2
  277. package/dist/protocol/usync.js +14 -0
  278. package/dist/retry/codec.js +220 -0
  279. package/dist/retry/constants.js +1 -1
  280. package/dist/retry/index.js +7 -5
  281. package/dist/retry/parse.js +88 -85
  282. package/dist/retry/replay.js +52 -49
  283. package/dist/retry/tracker.js +97 -0
  284. package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
  285. package/dist/signal/api/SignalDigestSyncApi.js +17 -8
  286. package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
  287. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
  288. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  289. package/dist/signal/api/SignalSessionSyncApi.js +36 -34
  290. package/dist/signal/api/result-map.js +13 -0
  291. package/dist/signal/constants.js +1 -5
  292. package/dist/signal/crypto/WaAdvSignature.js +11 -7
  293. package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
  294. package/dist/signal/group/SenderKeyChain.js +27 -22
  295. package/dist/signal/group/SenderKeyCodec.js +5 -6
  296. package/dist/signal/group/SenderKeyManager.js +144 -115
  297. package/dist/signal/index.js +15 -1
  298. package/dist/signal/registration/keygen.js +6 -2
  299. package/dist/signal/registration/utils.js +1 -0
  300. package/dist/signal/session/SignalProtocol.js +164 -53
  301. package/dist/signal/session/SignalRatchet.js +24 -15
  302. package/dist/signal/session/SignalSession.js +14 -9
  303. package/dist/signal/session/resolver.js +224 -0
  304. package/dist/store/contracts/privacy-token.store.js +2 -0
  305. package/dist/store/createStore.js +100 -188
  306. package/dist/store/index.js +15 -33
  307. package/dist/store/locks/appstate.lock.js +29 -0
  308. package/dist/store/locks/auth.lock.js +18 -0
  309. package/dist/store/locks/contact.lock.js +23 -0
  310. package/dist/store/locks/device-list.lock.js +23 -0
  311. package/dist/store/locks/message.lock.js +24 -0
  312. package/dist/store/locks/participants.lock.js +23 -0
  313. package/dist/store/locks/privacy-token.lock.js +21 -0
  314. package/dist/store/locks/retry.lock.js +32 -0
  315. package/dist/store/locks/sender-key.lock.js +55 -0
  316. package/dist/store/locks/signal.lock.js +66 -0
  317. package/dist/store/locks/thread.lock.js +24 -0
  318. package/dist/store/noop.store.js +4 -7
  319. package/dist/store/providers/memory/appstate.store.js +36 -14
  320. package/dist/store/providers/memory/contact.store.js +5 -0
  321. package/dist/store/providers/memory/device-list.store.js +12 -34
  322. package/dist/store/providers/memory/message.store.js +11 -5
  323. package/dist/store/providers/memory/participants.store.js +1 -8
  324. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  325. package/dist/store/providers/memory/retry.store.js +77 -2
  326. package/dist/store/providers/memory/sender-key.store.js +14 -11
  327. package/dist/store/providers/memory/signal.store.js +54 -25
  328. package/dist/store/providers/memory/thread.store.js +5 -0
  329. package/dist/transport/WaComms.js +30 -26
  330. package/dist/transport/WaWebSocket.js +148 -18
  331. package/dist/transport/binary/constants.js +1 -31
  332. package/dist/transport/binary/decoder.js +8 -8
  333. package/dist/transport/binary/encoder.js +10 -9
  334. package/dist/transport/binary/index.js +0 -4
  335. package/dist/transport/index.js +7 -1
  336. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  337. package/dist/transport/node/WaNodeOrchestrator.js +25 -21
  338. package/dist/transport/node/WaNodeTransport.js +0 -3
  339. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  340. package/dist/transport/node/builders/business.js +137 -0
  341. package/dist/transport/node/builders/global.js +375 -0
  342. package/dist/transport/node/builders/index.js +29 -17
  343. package/dist/transport/node/builders/message.js +64 -236
  344. package/dist/transport/node/builders/pairing.js +2 -29
  345. package/dist/transport/node/builders/privacy-token.js +46 -0
  346. package/dist/transport/node/builders/privacy.js +55 -0
  347. package/dist/transport/node/builders/profile.js +78 -0
  348. package/dist/transport/node/builders/retry.js +9 -21
  349. package/dist/transport/node/builders/usync.js +49 -0
  350. package/dist/transport/node/helpers.js +131 -4
  351. package/dist/transport/node/usync.js +8 -0
  352. package/dist/transport/node/xml.js +35 -14
  353. package/dist/transport/noise/WaClientPayload.js +13 -13
  354. package/dist/transport/noise/WaFrameCodec.js +47 -32
  355. package/dist/transport/noise/WaNoiseCert.js +5 -8
  356. package/dist/transport/noise/WaNoiseSession.js +77 -29
  357. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  358. package/dist/transport/proxy.js +34 -0
  359. package/dist/transport/stream/parse.js +20 -52
  360. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  361. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  362. package/dist/types/appstate/constants.d.ts +1 -0
  363. package/dist/types/appstate/encoding.d.ts +7 -0
  364. package/dist/types/appstate/index.d.ts +3 -3
  365. package/dist/types/appstate/utils.d.ts +0 -3
  366. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  367. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  368. package/dist/types/auth/index.d.ts +0 -4
  369. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  370. package/dist/types/auth/types.d.ts +7 -9
  371. package/dist/types/client/WaClient.d.ts +42 -25
  372. package/dist/types/client/WaClientFactory.d.ts +33 -26
  373. package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
  374. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  375. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  376. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  377. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  378. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
  379. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
  380. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  381. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  382. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  383. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +8 -0
  384. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  385. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  386. package/dist/types/client/dirty.d.ts +1 -0
  387. package/dist/types/client/events/devices.d.ts +20 -0
  388. package/dist/types/client/events/group.d.ts +2 -1
  389. package/dist/types/client/events/identity.d.ts +9 -0
  390. package/dist/types/client/events/privacy-token.d.ts +7 -0
  391. package/dist/types/client/history-sync.d.ts +9 -6
  392. package/dist/types/client/incoming.d.ts +3 -1
  393. package/dist/types/client/index.d.ts +1 -1
  394. package/dist/types/client/mailbox.d.ts +3 -5
  395. package/dist/types/client/messages.d.ts +1 -2
  396. package/dist/types/client/messaging/fanout.d.ts +14 -0
  397. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  398. package/dist/types/client/messaging/participants.d.ts +13 -0
  399. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  400. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  401. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  402. package/dist/types/client/types.d.ts +75 -4
  403. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  404. package/dist/types/crypto/core/index.d.ts +2 -3
  405. package/dist/types/crypto/core/nonce.d.ts +2 -0
  406. package/dist/types/crypto/core/primitives.d.ts +0 -1
  407. package/dist/types/crypto/core/random.d.ts +2 -7
  408. package/dist/types/crypto/index.d.ts +0 -1
  409. package/dist/types/crypto/math/constants.d.ts +4 -2
  410. package/dist/types/crypto/math/fe.d.ts +30 -0
  411. package/dist/types/crypto/math/mod.d.ts +0 -2
  412. package/dist/types/crypto/math/types.d.ts +11 -4
  413. package/dist/types/index.d.ts +5 -3
  414. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  415. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  416. package/dist/types/infra/log/types.d.ts +1 -0
  417. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  418. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  419. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  420. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  421. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  422. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  423. package/dist/types/media/WaMediaTransferClient.d.ts +16 -15
  424. package/dist/types/media/constants.d.ts +1 -1
  425. package/dist/types/media/index.d.ts +1 -1
  426. package/dist/types/media/types.d.ts +15 -2
  427. package/dist/types/message/addon-crypto.d.ts +25 -0
  428. package/dist/types/message/content.d.ts +8 -0
  429. package/dist/types/message/icdc.d.ts +13 -0
  430. package/dist/types/message/index.d.ts +2 -0
  431. package/dist/types/message/reporting-token.d.ts +18 -0
  432. package/dist/types/message/types.d.ts +45 -6
  433. package/dist/types/message/use-case-secret.d.ts +20 -0
  434. package/dist/types/protocol/appstate.d.ts +47 -0
  435. package/dist/types/protocol/constants.d.ts +8 -3
  436. package/dist/types/protocol/defaults.d.ts +6 -0
  437. package/dist/types/protocol/index.d.ts +2 -11
  438. package/dist/types/protocol/jid.d.ts +22 -5
  439. package/dist/types/protocol/message.d.ts +60 -0
  440. package/dist/types/protocol/nodes.d.ts +4 -0
  441. package/dist/types/protocol/notification.d.ts +2 -0
  442. package/dist/types/protocol/privacy-token.d.ts +17 -0
  443. package/dist/types/protocol/privacy.d.ts +75 -0
  444. package/dist/types/protocol/stream.d.ts +30 -0
  445. package/dist/types/protocol/usync.d.ts +11 -0
  446. package/dist/types/retry/codec.d.ts +3 -0
  447. package/dist/types/retry/index.d.ts +4 -3
  448. package/dist/types/retry/parse.d.ts +5 -2
  449. package/dist/types/retry/replay.d.ts +0 -4
  450. package/dist/types/retry/tracker.d.ts +20 -0
  451. package/dist/types/retry/types.d.ts +10 -4
  452. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
  453. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  454. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  455. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  456. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  457. package/dist/types/signal/api/result-map.d.ts +1 -0
  458. package/dist/types/signal/constants.d.ts +0 -3
  459. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  460. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  461. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  462. package/dist/types/signal/index.d.ts +3 -0
  463. package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
  464. package/dist/types/signal/session/resolver.d.ts +22 -0
  465. package/dist/types/store/contracts/appstate.store.d.ts +4 -1
  466. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  467. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  468. package/dist/types/store/contracts/message.store.d.ts +1 -0
  469. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  470. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  471. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  472. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  473. package/dist/types/store/contracts/signal.store.d.ts +13 -0
  474. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  475. package/dist/types/store/createStore.d.ts +1 -1
  476. package/dist/types/store/index.d.ts +5 -13
  477. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  478. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  479. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  480. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  481. package/dist/types/store/locks/message.lock.d.ts +3 -0
  482. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  483. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  484. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  485. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  486. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  487. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  488. package/dist/types/store/providers/memory/appstate.store.d.ts +3 -1
  489. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  490. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  491. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  492. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  493. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  494. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  495. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  496. package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
  497. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  498. package/dist/types/store/types.d.ts +49 -58
  499. package/dist/types/transport/WaWebSocket.d.ts +3 -1
  500. package/dist/types/transport/binary/constants.d.ts +0 -30
  501. package/dist/types/transport/binary/index.d.ts +0 -1
  502. package/dist/types/transport/index.d.ts +2 -1
  503. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  504. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  505. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  506. package/dist/types/transport/node/builders/business.d.ts +29 -0
  507. package/dist/types/transport/node/builders/global.d.ts +102 -0
  508. package/dist/types/transport/node/builders/group.d.ts +4 -6
  509. package/dist/types/transport/node/builders/index.d.ts +7 -3
  510. package/dist/types/transport/node/builders/message.d.ts +20 -30
  511. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  512. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  513. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  514. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  515. package/dist/types/transport/node/builders/retry.d.ts +2 -5
  516. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  517. package/dist/types/transport/node/helpers.d.ts +13 -0
  518. package/dist/types/transport/node/usync.d.ts +2 -0
  519. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  520. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  521. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  522. package/dist/types/transport/proxy.d.ts +6 -0
  523. package/dist/types/transport/stream/parse.d.ts +0 -1
  524. package/dist/types/transport/types.d.ts +18 -1
  525. package/dist/types/util/bytes.d.ts +5 -0
  526. package/dist/types/util/index.d.ts +5 -0
  527. package/dist/types/util/primitives.d.ts +2 -0
  528. package/dist/util/bytes.js +72 -46
  529. package/dist/util/coercion.js +6 -14
  530. package/dist/util/index.js +23 -0
  531. package/dist/util/primitives.js +42 -14
  532. package/package.json +52 -9
  533. package/proto/index.js +1 -1
  534. package/dist/crypto/core/constants.js +0 -4
  535. package/dist/crypto/core/encoding.js +0 -29
  536. package/dist/esm/crypto/core/constants.js +0 -1
  537. package/dist/esm/crypto/core/encoding.js +0 -25
  538. package/dist/esm/retry/outbound.js +0 -83
  539. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  540. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
  541. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  542. package/dist/esm/store/providers/sqlite/connection.js +0 -240
  543. package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
  544. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
  545. package/dist/esm/store/providers/sqlite/message.store.js +0 -119
  546. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  547. package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
  548. package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
  549. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
  550. package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
  551. package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
  552. package/dist/esm/util/base64.js +0 -18
  553. package/dist/esm/util/signal-address.js +0 -5
  554. package/dist/retry/outbound.js +0 -88
  555. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  556. package/dist/store/providers/sqlite/appstate.store.js +0 -173
  557. package/dist/store/providers/sqlite/auth.store.js +0 -180
  558. package/dist/store/providers/sqlite/connection.js +0 -276
  559. package/dist/store/providers/sqlite/contact.store.js +0 -65
  560. package/dist/store/providers/sqlite/device-list.store.js +0 -159
  561. package/dist/store/providers/sqlite/message.store.js +0 -123
  562. package/dist/store/providers/sqlite/migrations.js +0 -350
  563. package/dist/store/providers/sqlite/participants.store.js +0 -89
  564. package/dist/store/providers/sqlite/retry.store.js +0 -148
  565. package/dist/store/providers/sqlite/sender-key.store.js +0 -207
  566. package/dist/store/providers/sqlite/signal.store.js +0 -357
  567. package/dist/store/providers/sqlite/thread.store.js +0 -76
  568. package/dist/types/appstate/store/sqlite.d.ts +0 -21
  569. package/dist/types/crypto/core/constants.d.ts +0 -1
  570. package/dist/types/crypto/core/encoding.d.ts +0 -11
  571. package/dist/types/retry/outbound.d.ts +0 -4
  572. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  573. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -15
  574. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  575. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  576. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -10
  577. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
  578. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
  579. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  580. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
  581. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
  582. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
  583. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
  584. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
  585. package/dist/types/util/base64.d.ts +0 -4
  586. package/dist/types/util/signal-address.d.ts +0 -2
  587. package/dist/util/base64.js +0 -24
  588. package/dist/util/signal-address.js +0 -8
  589. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -1,203 +0,0 @@
1
- import { decodeSenderKeyDistributionRow, decodeSenderKeyRecord, decodeSqliteCount, encodeSenderKeyRecord, toSignalAddressParts } from '../../../signal/store/sqlite.js';
2
- import { BaseSqliteStore } from '../../providers/sqlite/BaseSqliteStore.js';
3
- import { asNumber, asString, resolvePositive } from '../../../util/coercion.js';
4
- const DEFAULTS = Object.freeze({
5
- distributionBatchSize: 250
6
- });
7
- export class SenderKeySqliteStore extends BaseSqliteStore {
8
- constructor(options, distributionBatchSize) {
9
- super(options, ['senderKey']);
10
- this.distributionBatchSize = resolvePositive(distributionBatchSize, DEFAULTS.distributionBatchSize, 'senderKey.sqlite.distributionBatchSize');
11
- }
12
- async upsertSenderKey(record) {
13
- const db = await this.getConnection();
14
- const sender = toSignalAddressParts(record.sender);
15
- db.run(`INSERT INTO sender_keys (
16
- session_id,
17
- group_id,
18
- sender_user,
19
- sender_server,
20
- sender_device,
21
- record
22
- ) VALUES (?, ?, ?, ?, ?, ?)
23
- ON CONFLICT(session_id, group_id, sender_user, sender_server, sender_device) DO UPDATE SET
24
- record=excluded.record`, [
25
- this.options.sessionId,
26
- record.groupId,
27
- sender.user,
28
- sender.server,
29
- sender.device,
30
- encodeSenderKeyRecord(record)
31
- ]);
32
- }
33
- async upsertSenderKeyDistribution(record) {
34
- const db = await this.getConnection();
35
- const sender = toSignalAddressParts(record.sender);
36
- this.upsertSenderKeyDistributionRow(db, record, sender);
37
- }
38
- async upsertSenderKeyDistributions(records) {
39
- if (records.length === 0) {
40
- return;
41
- }
42
- await this.withTransaction((db) => {
43
- for (const record of records) {
44
- const sender = toSignalAddressParts(record.sender);
45
- this.upsertSenderKeyDistributionRow(db, record, sender);
46
- }
47
- });
48
- }
49
- async getGroupSenderKeyList(groupId) {
50
- const db = await this.getConnection();
51
- const senderRows = db.all(`SELECT group_id, sender_user, sender_server, sender_device, record
52
- FROM sender_keys
53
- WHERE session_id = ? AND group_id = ?`, [this.options.sessionId, groupId]);
54
- const distributionRows = db.all(`SELECT group_id, sender_user, sender_server, sender_device, key_id, timestamp_ms
55
- FROM sender_key_distribution
56
- WHERE session_id = ? AND group_id = ?`, [this.options.sessionId, groupId]);
57
- return {
58
- skList: senderRows.map((row) => decodeSenderKeyRecord(row.record, asString(row.group_id, 'sender_keys.group_id'), {
59
- user: asString(row.sender_user, 'sender_keys.sender_user'),
60
- server: asString(row.sender_server, 'sender_keys.sender_server'),
61
- device: asNumber(row.sender_device, 'sender_keys.sender_device')
62
- })),
63
- skDistribList: distributionRows.map((row) => decodeSenderKeyDistributionRow(row))
64
- };
65
- }
66
- async getDeviceSenderKey(groupId, sender) {
67
- const db = await this.getConnection();
68
- const target = toSignalAddressParts(sender);
69
- const row = db.get(`SELECT group_id, sender_user, sender_server, sender_device, record
70
- FROM sender_keys
71
- WHERE session_id = ?
72
- AND group_id = ?
73
- AND sender_user = ?
74
- AND sender_server = ?
75
- AND sender_device = ?`, [this.options.sessionId, groupId, target.user, target.server, target.device]);
76
- if (!row) {
77
- return null;
78
- }
79
- return decodeSenderKeyRecord(row.record, asString(row.group_id, 'sender_keys.group_id'), {
80
- user: asString(row.sender_user, 'sender_keys.sender_user'),
81
- server: asString(row.sender_server, 'sender_keys.sender_server'),
82
- device: asNumber(row.sender_device, 'sender_keys.sender_device')
83
- });
84
- }
85
- async getDeviceSenderKeyDistribution(groupId, sender) {
86
- const db = await this.getConnection();
87
- const target = toSignalAddressParts(sender);
88
- const row = db.get(`SELECT group_id, sender_user, sender_server, sender_device, key_id, timestamp_ms
89
- FROM sender_key_distribution
90
- WHERE session_id = ?
91
- AND group_id = ?
92
- AND sender_user = ?
93
- AND sender_server = ?
94
- AND sender_device = ?`, [this.options.sessionId, groupId, target.user, target.server, target.device]);
95
- return row ? decodeSenderKeyDistributionRow(row) : null;
96
- }
97
- async getDeviceSenderKeyDistributions(groupId, senders) {
98
- if (senders.length === 0) {
99
- return [];
100
- }
101
- const db = await this.getConnection();
102
- const targets = senders.map((sender) => toSignalAddressParts(sender));
103
- const map = new Map();
104
- for (let start = 0; start < targets.length; start += this.distributionBatchSize) {
105
- const end = Math.min(start + this.distributionBatchSize, targets.length);
106
- const batchLength = end - start;
107
- const filters = new Array(batchLength)
108
- .fill('(sender_user = ? AND sender_server = ? AND sender_device = ?)')
109
- .join(' OR ');
110
- const params = [this.options.sessionId, groupId];
111
- for (let index = start; index < end; index += 1) {
112
- const target = targets[index];
113
- params.push(target.user, target.server, target.device);
114
- }
115
- const rows = db.all(`SELECT group_id, sender_user, sender_server, sender_device, key_id, timestamp_ms
116
- FROM sender_key_distribution
117
- WHERE session_id = ? AND group_id = ? AND (${filters})`, params);
118
- for (const row of rows) {
119
- map.set(this.distributionRowKey(row), decodeSenderKeyDistributionRow(row));
120
- }
121
- }
122
- return targets.map((target) => {
123
- return (map.get(this.distributionTargetKey(target.user, target.server, target.device)) ??
124
- null);
125
- });
126
- }
127
- async deleteDeviceSenderKey(target, groupId) {
128
- const sender = toSignalAddressParts(target);
129
- return this.withTransaction((db) => {
130
- const senderCount = this.countDelete(db, 'sender_keys', sender, groupId);
131
- const distributionCount = this.countDelete(db, 'sender_key_distribution', sender, groupId);
132
- return senderCount + distributionCount;
133
- });
134
- }
135
- async markForgetSenderKey(groupId, participants) {
136
- if (participants.length === 0) {
137
- return 0;
138
- }
139
- return this.withTransaction(async (db) => {
140
- let deleted = 0;
141
- for (const participant of participants) {
142
- const sender = toSignalAddressParts(participant);
143
- deleted += this.countDelete(db, 'sender_keys', sender, groupId);
144
- deleted += this.countDelete(db, 'sender_key_distribution', sender, groupId);
145
- }
146
- return deleted;
147
- });
148
- }
149
- async clear() {
150
- await this.withTransaction((db) => {
151
- db.run('DELETE FROM sender_keys WHERE session_id = ?', [this.options.sessionId]);
152
- db.run('DELETE FROM sender_key_distribution WHERE session_id = ?', [
153
- this.options.sessionId
154
- ]);
155
- });
156
- }
157
- countDelete(db, table, target, groupId) {
158
- const whereWithGroup = 'session_id = ? AND sender_user = ? AND sender_server = ? AND sender_device = ? AND group_id = ?';
159
- const whereAllGroups = 'session_id = ? AND sender_user = ? AND sender_server = ? AND sender_device = ?';
160
- const countRow = db.get(`SELECT COUNT(*) AS count
161
- FROM ${table}
162
- WHERE ${groupId ? whereWithGroup : whereAllGroups}`, groupId
163
- ? [this.options.sessionId, target.user, target.server, target.device, groupId]
164
- : [this.options.sessionId, target.user, target.server, target.device]);
165
- const count = decodeSqliteCount(countRow, `${table}.count`);
166
- if (count === 0) {
167
- return 0;
168
- }
169
- db.run(`DELETE FROM ${table}
170
- WHERE ${groupId ? whereWithGroup : whereAllGroups}`, groupId
171
- ? [this.options.sessionId, target.user, target.server, target.device, groupId]
172
- : [this.options.sessionId, target.user, target.server, target.device]);
173
- return count;
174
- }
175
- upsertSenderKeyDistributionRow(db, record, sender) {
176
- db.run(`INSERT INTO sender_key_distribution (
177
- session_id,
178
- group_id,
179
- sender_user,
180
- sender_server,
181
- sender_device,
182
- key_id,
183
- timestamp_ms
184
- ) VALUES (?, ?, ?, ?, ?, ?, ?)
185
- ON CONFLICT(session_id, group_id, sender_user, sender_server, sender_device) DO UPDATE SET
186
- key_id=excluded.key_id,
187
- timestamp_ms=excluded.timestamp_ms`, [
188
- this.options.sessionId,
189
- record.groupId,
190
- sender.user,
191
- sender.server,
192
- sender.device,
193
- record.keyId,
194
- record.timestampMs
195
- ]);
196
- }
197
- distributionRowKey(row) {
198
- return this.distributionTargetKey(asString(row.sender_user, 'sender_key_distribution.sender_user'), asString(row.sender_server, 'sender_key_distribution.sender_server'), asNumber(row.sender_device, 'sender_key_distribution.sender_device'));
199
- }
200
- distributionTargetKey(user, server, device) {
201
- return `${user}|${server}|${device}`;
202
- }
203
- }
@@ -1,353 +0,0 @@
1
- import { decodeSignalPreKeyRow, decodeSignalRegistrationRow, decodeSignalRemoteIdentity, decodeSignalSessionRecord, decodeSignalSignedPreKeyRow, encodeSignalSessionRecord, toSignalAddressParts } from '../../../signal/store/sqlite.js';
2
- import { BaseSqliteStore } from '../../providers/sqlite/BaseSqliteStore.js';
3
- import { asNumber, asOptionalNumber, asString, toBoolOrUndef, resolvePositive } from '../../../util/coercion.js';
4
- import { signalAddressKey } from '../../../util/signal-address.js';
5
- const DEFAULTS = Object.freeze({
6
- preKeyBatchSize: 500,
7
- hasSessionBatchSize: 250
8
- });
9
- export class WaSignalSqliteStore extends BaseSqliteStore {
10
- constructor(options, storeOptions = {}) {
11
- super(options, ['signal']);
12
- this.preKeyBatchSize = resolvePositive(storeOptions.preKeyBatchSize, DEFAULTS.preKeyBatchSize, 'signal.sqlite.preKeyBatchSize');
13
- this.hasSessionBatchSize = resolvePositive(storeOptions.hasSessionBatchSize, DEFAULTS.hasSessionBatchSize, 'signal.sqlite.hasSessionBatchSize');
14
- }
15
- async getRegistrationInfo() {
16
- const db = await this.getConnection();
17
- const row = db.get(`SELECT registration_id, identity_pub_key, identity_priv_key
18
- FROM signal_registration
19
- WHERE session_id = ?`, [this.options.sessionId]);
20
- return row ? decodeSignalRegistrationRow(row) : null;
21
- }
22
- async setRegistrationInfo(info) {
23
- const db = await this.getConnection();
24
- db.run(`INSERT INTO signal_registration (
25
- session_id,
26
- registration_id,
27
- identity_pub_key,
28
- identity_priv_key
29
- ) VALUES (?, ?, ?, ?)
30
- ON CONFLICT(session_id) DO UPDATE SET
31
- registration_id=excluded.registration_id,
32
- identity_pub_key=excluded.identity_pub_key,
33
- identity_priv_key=excluded.identity_priv_key`, [
34
- this.options.sessionId,
35
- info.registrationId,
36
- info.identityKeyPair.pubKey,
37
- info.identityKeyPair.privKey
38
- ]);
39
- }
40
- async getSignedPreKey() {
41
- const db = await this.getConnection();
42
- const row = db.get(`SELECT key_id, pub_key, priv_key, signature, uploaded
43
- FROM signal_signed_prekey
44
- WHERE session_id = ?`, [this.options.sessionId]);
45
- return row ? decodeSignalSignedPreKeyRow(row) : null;
46
- }
47
- async setSignedPreKey(record) {
48
- const db = await this.getConnection();
49
- db.run(`INSERT INTO signal_signed_prekey (
50
- session_id,
51
- key_id,
52
- pub_key,
53
- priv_key,
54
- signature,
55
- uploaded
56
- ) VALUES (?, ?, ?, ?, ?, ?)
57
- ON CONFLICT(session_id) DO UPDATE SET
58
- key_id=excluded.key_id,
59
- pub_key=excluded.pub_key,
60
- priv_key=excluded.priv_key,
61
- signature=excluded.signature,
62
- uploaded=excluded.uploaded`, [
63
- this.options.sessionId,
64
- record.keyId,
65
- record.keyPair.pubKey,
66
- record.keyPair.privKey,
67
- record.signature,
68
- record.uploaded === true ? 1 : 0
69
- ]);
70
- }
71
- async getSignedPreKeyById(keyId) {
72
- const db = await this.getConnection();
73
- const row = db.get(`SELECT key_id, pub_key, priv_key, signature, uploaded
74
- FROM signal_signed_prekey
75
- WHERE session_id = ? AND key_id = ?`, [this.options.sessionId, keyId]);
76
- return row ? decodeSignalSignedPreKeyRow(row) : null;
77
- }
78
- async setSignedPreKeyRotationTs(value) {
79
- const db = await this.getConnection();
80
- this.ensureMetaRow(db);
81
- db.run(`UPDATE signal_meta
82
- SET signed_prekey_rotation_ts = ?
83
- WHERE session_id = ?`, [value, this.options.sessionId]);
84
- }
85
- async getSignedPreKeyRotationTs() {
86
- const db = await this.getConnection();
87
- const meta = this.getMeta(db);
88
- return meta.signedPreKeyRotationTs;
89
- }
90
- async putPreKey(record) {
91
- const db = await this.getConnection();
92
- this.ensureMetaRow(db);
93
- this.upsertPreKey(db, record);
94
- db.run(`UPDATE signal_meta
95
- SET next_prekey_id = MAX(next_prekey_id, ?)
96
- WHERE session_id = ?`, [record.keyId + 1, this.options.sessionId]);
97
- }
98
- async getOrGenPreKeys(count, generator) {
99
- if (!Number.isSafeInteger(count) || count <= 0) {
100
- throw new Error(`invalid prekey count: ${count}`);
101
- }
102
- return this.withTransaction(async (db) => {
103
- this.ensureMetaRow(db);
104
- const available = db
105
- .all(`SELECT key_id, pub_key, priv_key, uploaded
106
- FROM signal_prekey
107
- WHERE session_id = ? AND uploaded = 0
108
- ORDER BY key_id ASC
109
- LIMIT ?`, [this.options.sessionId, count])
110
- .map((row) => decodeSignalPreKeyRow(row));
111
- if (available.length < count) {
112
- let nextPreKeyId = this.getMeta(db).nextPreKeyId;
113
- while (available.length < count) {
114
- const requestedKeyId = nextPreKeyId;
115
- const generated = await generator(requestedKeyId);
116
- this.upsertPreKey(db, generated);
117
- available.push(generated);
118
- nextPreKeyId = Math.max(requestedKeyId + 1, generated.keyId + 1);
119
- }
120
- db.run(`UPDATE signal_meta
121
- SET next_prekey_id = ?
122
- WHERE session_id = ?`, [nextPreKeyId, this.options.sessionId]);
123
- }
124
- return available;
125
- });
126
- }
127
- async getPreKeyById(keyId) {
128
- const db = await this.getConnection();
129
- const row = db.get(`SELECT key_id, pub_key, priv_key, uploaded
130
- FROM signal_prekey
131
- WHERE session_id = ? AND key_id = ?`, [this.options.sessionId, keyId]);
132
- return row ? decodeSignalPreKeyRow(row) : null;
133
- }
134
- async getPreKeysById(keyIds) {
135
- if (keyIds.length === 0) {
136
- return [];
137
- }
138
- const db = await this.getConnection();
139
- const uniqueKeyIds = [...new Set(keyIds)];
140
- const byId = new Map();
141
- for (let start = 0; start < uniqueKeyIds.length; start += this.preKeyBatchSize) {
142
- const end = Math.min(start + this.preKeyBatchSize, uniqueKeyIds.length);
143
- const batchLength = end - start;
144
- const placeholders = new Array(batchLength).fill('?').join(', ');
145
- const params = [this.options.sessionId];
146
- for (let index = start; index < end; index += 1) {
147
- params.push(uniqueKeyIds[index]);
148
- }
149
- const rows = db.all(`SELECT key_id, pub_key, priv_key, uploaded
150
- FROM signal_prekey
151
- WHERE session_id = ? AND key_id IN (${placeholders})`, params);
152
- for (const row of rows) {
153
- const record = decodeSignalPreKeyRow(row);
154
- byId.set(record.keyId, record);
155
- }
156
- }
157
- return keyIds.map((keyId) => byId.get(keyId) ?? null);
158
- }
159
- async consumePreKeyById(keyId) {
160
- return this.withTransaction((db) => {
161
- const row = db.get(`SELECT key_id, pub_key, priv_key, uploaded
162
- FROM signal_prekey
163
- WHERE session_id = ? AND key_id = ?`, [this.options.sessionId, keyId]);
164
- if (!row) {
165
- return null;
166
- }
167
- db.run(`DELETE FROM signal_prekey
168
- WHERE session_id = ? AND key_id = ?`, [this.options.sessionId, keyId]);
169
- return decodeSignalPreKeyRow(row);
170
- });
171
- }
172
- async getOrGenSinglePreKey(generator) {
173
- const records = await this.getOrGenPreKeys(1, generator);
174
- return records[0];
175
- }
176
- async markKeyAsUploaded(keyId) {
177
- const db = await this.getConnection();
178
- const meta = this.getMeta(db);
179
- if (keyId < 0 || keyId >= meta.nextPreKeyId) {
180
- throw new Error(`prekey ${keyId} is out of boundary`);
181
- }
182
- db.run(`UPDATE signal_prekey
183
- SET uploaded = 1
184
- WHERE session_id = ? AND key_id <= ?`, [this.options.sessionId, keyId]);
185
- }
186
- async setServerHasPreKeys(value) {
187
- const db = await this.getConnection();
188
- this.ensureMetaRow(db);
189
- db.run(`UPDATE signal_meta
190
- SET server_has_prekeys = ?
191
- WHERE session_id = ?`, [value ? 1 : 0, this.options.sessionId]);
192
- }
193
- async getServerHasPreKeys() {
194
- const db = await this.getConnection();
195
- const meta = this.getMeta(db);
196
- return meta.serverHasPreKeys;
197
- }
198
- async hasSession(address) {
199
- const db = await this.getConnection();
200
- const target = toSignalAddressParts(address);
201
- return (db.get(`SELECT 1 AS has_session
202
- FROM signal_session
203
- WHERE session_id = ? AND user = ? AND server = ? AND device = ?
204
- LIMIT 1`, [this.options.sessionId, target.user, target.server, target.device]) !== null);
205
- }
206
- async hasSessions(addresses) {
207
- if (addresses.length === 0) {
208
- return [];
209
- }
210
- const db = await this.getConnection();
211
- const targets = addresses.map((address) => toSignalAddressParts(address));
212
- const existingKeys = new Set();
213
- for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
214
- const end = Math.min(start + this.hasSessionBatchSize, targets.length);
215
- const batchLength = end - start;
216
- const filters = new Array(batchLength)
217
- .fill('(user = ? AND server = ? AND device = ?)')
218
- .join(' OR ');
219
- const params = [this.options.sessionId];
220
- for (let index = start; index < end; index += 1) {
221
- const target = targets[index];
222
- params.push(target.user, target.server, target.device);
223
- }
224
- const rows = db.all(`SELECT user, server, device
225
- FROM signal_session
226
- WHERE session_id = ? AND (${filters})`, params);
227
- for (const row of rows) {
228
- existingKeys.add(signalAddressKey({
229
- user: asString(row.user, 'signal_session.user'),
230
- server: asString(row.server, 'signal_session.server'),
231
- device: asNumber(row.device, 'signal_session.device')
232
- }));
233
- }
234
- }
235
- return addresses.map((address) => existingKeys.has(signalAddressKey(address)));
236
- }
237
- async getSession(address) {
238
- const db = await this.getConnection();
239
- const target = toSignalAddressParts(address);
240
- const row = db.get(`SELECT user, server, device, record
241
- FROM signal_session
242
- WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
243
- return row ? decodeSignalSessionRecord(row.record) : null;
244
- }
245
- async setSession(address, session) {
246
- const db = await this.getConnection();
247
- const target = toSignalAddressParts(address);
248
- db.run(`INSERT INTO signal_session (
249
- session_id,
250
- user,
251
- server,
252
- device,
253
- record
254
- ) VALUES (?, ?, ?, ?, ?)
255
- ON CONFLICT(session_id, user, server, device) DO UPDATE SET
256
- record=excluded.record`, [
257
- this.options.sessionId,
258
- target.user,
259
- target.server,
260
- target.device,
261
- encodeSignalSessionRecord(session)
262
- ]);
263
- }
264
- async deleteSession(address) {
265
- const db = await this.getConnection();
266
- const target = toSignalAddressParts(address);
267
- db.run(`DELETE FROM signal_session
268
- WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
269
- }
270
- async getRemoteIdentity(address) {
271
- const db = await this.getConnection();
272
- const target = toSignalAddressParts(address);
273
- const row = db.get(`SELECT identity_key
274
- FROM signal_identity
275
- WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
276
- return row ? decodeSignalRemoteIdentity(row.identity_key) : null;
277
- }
278
- async setRemoteIdentity(address, identityKey) {
279
- const db = await this.getConnection();
280
- const target = toSignalAddressParts(address);
281
- this.upsertRemoteIdentity(db, target, identityKey);
282
- }
283
- async setRemoteIdentities(entries) {
284
- if (entries.length === 0) {
285
- return;
286
- }
287
- await this.withTransaction((db) => {
288
- for (const entry of entries) {
289
- const target = toSignalAddressParts(entry.address);
290
- this.upsertRemoteIdentity(db, target, entry.identityKey);
291
- }
292
- });
293
- }
294
- async clear() {
295
- await this.withTransaction((db) => {
296
- db.run('DELETE FROM signal_registration WHERE session_id = ?', [this.options.sessionId]);
297
- db.run('DELETE FROM signal_signed_prekey WHERE session_id = ?', [this.options.sessionId]);
298
- db.run('DELETE FROM signal_prekey WHERE session_id = ?', [this.options.sessionId]);
299
- db.run('DELETE FROM signal_session WHERE session_id = ?', [this.options.sessionId]);
300
- db.run('DELETE FROM signal_identity WHERE session_id = ?', [this.options.sessionId]);
301
- db.run('DELETE FROM signal_meta WHERE session_id = ?', [this.options.sessionId]);
302
- });
303
- }
304
- upsertPreKey(db, record) {
305
- db.run(`INSERT INTO signal_prekey (
306
- session_id,
307
- key_id,
308
- pub_key,
309
- priv_key,
310
- uploaded
311
- ) VALUES (?, ?, ?, ?, ?)
312
- ON CONFLICT(session_id, key_id) DO UPDATE SET
313
- pub_key=excluded.pub_key,
314
- priv_key=excluded.priv_key,
315
- uploaded=excluded.uploaded`, [
316
- this.options.sessionId,
317
- record.keyId,
318
- record.keyPair.pubKey,
319
- record.keyPair.privKey,
320
- record.uploaded === true ? 1 : 0
321
- ]);
322
- }
323
- ensureMetaRow(db) {
324
- db.run(`INSERT INTO signal_meta (
325
- session_id,
326
- server_has_prekeys,
327
- next_prekey_id
328
- ) VALUES (?, 0, 1)
329
- ON CONFLICT(session_id) DO NOTHING`, [this.options.sessionId]);
330
- }
331
- getMeta(db) {
332
- this.ensureMetaRow(db);
333
- const row = db.get(`SELECT server_has_prekeys, next_prekey_id, signed_prekey_rotation_ts
334
- FROM signal_meta
335
- WHERE session_id = ?`, [this.options.sessionId]);
336
- return {
337
- serverHasPreKeys: toBoolOrUndef(row.server_has_prekeys) === true,
338
- nextPreKeyId: asNumber(row.next_prekey_id, 'signal_meta.next_prekey_id'),
339
- signedPreKeyRotationTs: asOptionalNumber(row.signed_prekey_rotation_ts, 'signal_meta.signed_prekey_rotation_ts') ?? null
340
- };
341
- }
342
- upsertRemoteIdentity(db, target, identityKey) {
343
- db.run(`INSERT INTO signal_identity (
344
- session_id,
345
- user,
346
- server,
347
- device,
348
- identity_key
349
- ) VALUES (?, ?, ?, ?, ?)
350
- ON CONFLICT(session_id, user, server, device) DO UPDATE SET
351
- identity_key=excluded.identity_key`, [this.options.sessionId, target.user, target.server, target.device, identityKey]);
352
- }
353
- }
@@ -1,72 +0,0 @@
1
- import { BaseSqliteStore } from '../../providers/sqlite/BaseSqliteStore.js';
2
- import { asOptionalNumber, asOptionalString, asString, toBoolOrUndef } from '../../../util/coercion.js';
3
- import { normalizeQueryLimit } from '../../../util/collections.js';
4
- const THREAD_COLUMNS = 'jid, name, unread_count, archived, pinned, mute_end_ms, marked_as_unread, ephemeral_expiration';
5
- function decodeThreadRow(row) {
6
- return {
7
- jid: asString(row.jid, 'mailbox_threads.jid'),
8
- name: asOptionalString(row.name, 'mailbox_threads.name'),
9
- unreadCount: asOptionalNumber(row.unread_count, 'mailbox_threads.unread_count'),
10
- archived: toBoolOrUndef(row.archived),
11
- pinned: asOptionalNumber(row.pinned, 'mailbox_threads.pinned'),
12
- muteEndMs: asOptionalNumber(row.mute_end_ms, 'mailbox_threads.mute_end_ms'),
13
- markedAsUnread: toBoolOrUndef(row.marked_as_unread),
14
- ephemeralExpiration: asOptionalNumber(row.ephemeral_expiration, 'mailbox_threads.ephemeral_expiration')
15
- };
16
- }
17
- export class WaThreadSqliteStore extends BaseSqliteStore {
18
- constructor(options) {
19
- super(options, ['mailbox']);
20
- }
21
- async upsert(record) {
22
- const db = await this.getConnection();
23
- db.run(`INSERT INTO mailbox_threads (
24
- session_id, jid, name, unread_count, archived, pinned,
25
- mute_end_ms, marked_as_unread, ephemeral_expiration
26
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
27
- ON CONFLICT(session_id, jid) DO UPDATE SET
28
- name=COALESCE(excluded.name, mailbox_threads.name),
29
- unread_count=COALESCE(excluded.unread_count, mailbox_threads.unread_count),
30
- archived=COALESCE(excluded.archived, mailbox_threads.archived),
31
- pinned=COALESCE(excluded.pinned, mailbox_threads.pinned),
32
- mute_end_ms=COALESCE(excluded.mute_end_ms, mailbox_threads.mute_end_ms),
33
- marked_as_unread=COALESCE(excluded.marked_as_unread, mailbox_threads.marked_as_unread),
34
- ephemeral_expiration=COALESCE(excluded.ephemeral_expiration, mailbox_threads.ephemeral_expiration)`, [
35
- this.options.sessionId,
36
- record.jid,
37
- record.name ?? null,
38
- record.unreadCount ?? null,
39
- record.archived === undefined ? null : record.archived ? 1 : 0,
40
- record.pinned ?? null,
41
- record.muteEndMs ?? null,
42
- record.markedAsUnread === undefined ? null : record.markedAsUnread ? 1 : 0,
43
- record.ephemeralExpiration ?? null
44
- ]);
45
- }
46
- async getByJid(jid) {
47
- const db = await this.getConnection();
48
- const row = db.get(`SELECT ${THREAD_COLUMNS}
49
- FROM mailbox_threads
50
- WHERE session_id = ? AND jid = ?`, [this.options.sessionId, jid]);
51
- return row ? decodeThreadRow(row) : null;
52
- }
53
- async list(limit) {
54
- const db = await this.getConnection();
55
- const rows = db.all(`SELECT ${THREAD_COLUMNS}
56
- FROM mailbox_threads
57
- WHERE session_id = ?
58
- LIMIT ?`, [this.options.sessionId, normalizeQueryLimit(limit, 100)]);
59
- return rows.map(decodeThreadRow);
60
- }
61
- async deleteByJid(jid) {
62
- const db = await this.getConnection();
63
- db.run(`DELETE FROM mailbox_threads
64
- WHERE session_id = ? AND jid = ?`, [this.options.sessionId, jid]);
65
- const row = db.get('SELECT changes() AS total', []);
66
- return row ? Number(row.total) : 0;
67
- }
68
- async clear() {
69
- const db = await this.getConnection();
70
- db.run('DELETE FROM mailbox_threads WHERE session_id = ?', [this.options.sessionId]);
71
- }
72
- }
@@ -1,18 +0,0 @@
1
- import { base64ToBytes as decodeBase64, bytesToBase64, bytesToBase64UrlSafe } from './bytes.js';
2
- export { bytesToBase64, bytesToBase64UrlSafe };
3
- export function base64ToBytes(value, field, requireNonEmpty = true) {
4
- const out = decodeBase64(value);
5
- if (requireNonEmpty && out.length === 0) {
6
- throw new Error(`invalid base64 payload for ${field}`);
7
- }
8
- return out;
9
- }
10
- export function decodeProtoBytes(value, field) {
11
- if (value === null || value === undefined) {
12
- throw new Error(`missing protobuf bytes field ${field}`);
13
- }
14
- if (value instanceof Uint8Array) {
15
- return value;
16
- }
17
- return decodeBase64(value);
18
- }
@@ -1,5 +0,0 @@
1
- import { WA_DEFAULTS } from '../protocol/constants.js';
2
- export function signalAddressKey(address) {
3
- const server = address.server ?? WA_DEFAULTS.HOST_DOMAIN;
4
- return `${address.user}|${server}|${address.device}`;
5
- }