zapo-js 0.1.2 → 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 (468) hide show
  1. package/README.md +12 -4
  2. package/dist/appstate/WaAppStateCrypto.js +1 -1
  3. package/dist/appstate/WaAppStateSyncClient.js +138 -93
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +8 -6
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +36 -47
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  11. package/dist/auth/pairing/WaPairingFlow.js +13 -3
  12. package/dist/client/WaClient.js +225 -101
  13. package/dist/client/WaClientFactory.js +294 -44
  14. package/dist/client/connection/WaConnectionManager.js +19 -10
  15. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  16. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  17. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  18. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
  19. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  20. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  21. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  22. package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
  23. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  24. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  25. package/dist/client/dirty.js +40 -20
  26. package/dist/client/events/devices.js +72 -0
  27. package/dist/client/events/group.js +3 -11
  28. package/dist/client/events/identity.js +22 -0
  29. package/dist/client/events/privacy-token.js +39 -0
  30. package/dist/client/history-sync.js +50 -9
  31. package/dist/client/incoming.js +37 -7
  32. package/dist/client/mailbox.js +24 -23
  33. package/dist/client/messages.js +107 -31
  34. package/dist/client/messaging/fanout.js +21 -11
  35. package/dist/client/messaging/participants.js +6 -4
  36. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  37. package/dist/client/tokens/cs-token.js +50 -0
  38. package/dist/client/tokens/tc-token.js +25 -0
  39. package/dist/crypto/core/index.js +2 -2
  40. package/dist/crypto/core/keys.js +4 -4
  41. package/dist/crypto/core/nonce.js +2 -0
  42. package/dist/crypto/core/primitives.js +0 -8
  43. package/dist/crypto/core/random.js +22 -0
  44. package/dist/crypto/curves/X25519.js +25 -6
  45. package/dist/crypto/index.js +3 -0
  46. package/dist/crypto/math/constants.js +13 -36
  47. package/dist/crypto/math/edwards.js +171 -44
  48. package/dist/crypto/math/fe.js +706 -0
  49. package/dist/crypto/math/mod.js +10 -3
  50. package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
  51. package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
  52. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  53. package/dist/esm/appstate/index.js +2 -2
  54. package/dist/esm/appstate/utils.js +2 -5
  55. package/dist/esm/auth/WaAuthClient.js +36 -47
  56. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
  57. package/dist/esm/auth/index.js +0 -2
  58. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  59. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
  60. package/dist/esm/client/WaClient.js +225 -101
  61. package/dist/esm/client/WaClientFactory.js +295 -45
  62. package/dist/esm/client/connection/WaConnectionManager.js +19 -10
  63. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  64. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  65. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  66. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
  67. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  68. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  69. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  70. package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
  71. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  72. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  73. package/dist/esm/client/dirty.js +40 -20
  74. package/dist/esm/client/events/devices.js +68 -0
  75. package/dist/esm/client/events/group.js +3 -11
  76. package/dist/esm/client/events/identity.js +19 -0
  77. package/dist/esm/client/events/privacy-token.js +36 -0
  78. package/dist/esm/client/history-sync.js +50 -9
  79. package/dist/esm/client/incoming.js +38 -8
  80. package/dist/esm/client/mailbox.js +24 -23
  81. package/dist/esm/client/messages.js +108 -32
  82. package/dist/esm/client/messaging/fanout.js +22 -12
  83. package/dist/esm/client/messaging/participants.js +6 -4
  84. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  85. package/dist/esm/client/tokens/cs-token.js +46 -0
  86. package/dist/esm/client/tokens/tc-token.js +18 -0
  87. package/dist/esm/crypto/core/index.js +2 -2
  88. package/dist/esm/crypto/core/keys.js +1 -1
  89. package/dist/esm/crypto/core/nonce.js +2 -0
  90. package/dist/esm/crypto/core/primitives.js +0 -7
  91. package/dist/esm/crypto/core/random.js +22 -1
  92. package/dist/esm/crypto/curves/X25519.js +25 -6
  93. package/dist/esm/crypto/index.js +1 -0
  94. package/dist/esm/crypto/math/constants.js +12 -35
  95. package/dist/esm/crypto/math/edwards.js +174 -47
  96. package/dist/esm/crypto/math/fe.js +691 -0
  97. package/dist/esm/crypto/math/mod.js +10 -1
  98. package/dist/esm/index.js +1 -1
  99. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  100. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  101. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  102. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  103. package/dist/esm/infra/perf/StoreLock.js +77 -0
  104. package/dist/esm/media/WaMediaCrypto.js +95 -13
  105. package/dist/esm/media/WaMediaTransferClient.js +39 -47
  106. package/dist/esm/media/constants.js +2 -1
  107. package/dist/esm/message/WaMessageClient.js +26 -19
  108. package/dist/esm/message/content.js +195 -9
  109. package/dist/esm/message/icdc.js +76 -0
  110. package/dist/esm/message/incoming.js +24 -12
  111. package/dist/esm/message/phash.js +3 -1
  112. package/dist/esm/message/reporting-token.js +14 -27
  113. package/dist/esm/protocol/appstate.js +9 -40
  114. package/dist/esm/protocol/browser.js +10 -18
  115. package/dist/esm/protocol/constants.js +5 -3
  116. package/dist/esm/protocol/defaults.js +6 -0
  117. package/dist/esm/protocol/index.js +1 -2
  118. package/dist/esm/protocol/jid.js +105 -36
  119. package/dist/esm/protocol/message.js +61 -1
  120. package/dist/esm/protocol/nodes.js +2 -0
  121. package/dist/esm/protocol/notification.js +3 -1
  122. package/dist/esm/protocol/privacy-token.js +17 -0
  123. package/dist/esm/protocol/privacy.js +55 -0
  124. package/dist/esm/protocol/stream.js +26 -1
  125. package/dist/esm/retry/codec.js +216 -0
  126. package/dist/esm/retry/constants.js +1 -1
  127. package/dist/esm/retry/index.js +2 -2
  128. package/dist/esm/retry/parse.js +50 -30
  129. package/dist/esm/retry/replay.js +11 -7
  130. package/dist/esm/retry/tracker.js +50 -12
  131. package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
  132. package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
  133. package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
  134. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
  135. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  136. package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
  137. package/dist/esm/signal/api/result-map.js +10 -0
  138. package/dist/esm/signal/constants.js +0 -4
  139. package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
  140. package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
  141. package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
  142. package/dist/esm/signal/group/SenderKeyManager.js +125 -106
  143. package/dist/esm/signal/index.js +1 -0
  144. package/dist/esm/signal/registration/keygen.js +6 -2
  145. package/dist/esm/signal/registration/utils.js +1 -0
  146. package/dist/esm/signal/session/SignalProtocol.js +150 -74
  147. package/dist/esm/signal/session/resolver.js +137 -102
  148. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  149. package/dist/esm/store/createStore.js +101 -187
  150. package/dist/esm/store/index.js +1 -10
  151. package/dist/esm/store/locks/appstate.lock.js +26 -0
  152. package/dist/esm/store/locks/auth.lock.js +15 -0
  153. package/dist/esm/store/locks/contact.lock.js +20 -0
  154. package/dist/esm/store/locks/device-list.lock.js +20 -0
  155. package/dist/esm/store/locks/message.lock.js +21 -0
  156. package/dist/esm/store/locks/participants.lock.js +20 -0
  157. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  158. package/dist/esm/store/locks/retry.lock.js +29 -0
  159. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  160. package/dist/esm/store/locks/signal.lock.js +63 -0
  161. package/dist/esm/store/locks/thread.lock.js +21 -0
  162. package/dist/esm/store/noop.store.js +1 -1
  163. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  164. package/dist/esm/store/providers/memory/device-list.store.js +10 -5
  165. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  166. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  167. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  168. package/dist/esm/store/providers/memory/signal.store.js +36 -19
  169. package/dist/esm/transport/WaComms.js +3 -1
  170. package/dist/esm/transport/WaWebSocket.js +0 -6
  171. package/dist/esm/transport/binary/constants.js +0 -30
  172. package/dist/esm/transport/binary/decoder.js +4 -4
  173. package/dist/esm/transport/binary/encoder.js +8 -15
  174. package/dist/esm/transport/binary/index.js +0 -1
  175. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
  176. package/dist/esm/transport/node/builders/business.js +129 -0
  177. package/dist/esm/transport/node/builders/global.js +370 -0
  178. package/dist/esm/transport/node/builders/index.js +5 -2
  179. package/dist/esm/transport/node/builders/message.js +63 -239
  180. package/dist/esm/transport/node/builders/pairing.js +0 -24
  181. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  182. package/dist/esm/transport/node/builders/privacy.js +48 -0
  183. package/dist/esm/transport/node/builders/profile.js +70 -0
  184. package/dist/esm/transport/node/builders/retry.js +10 -22
  185. package/dist/esm/transport/node/builders/usync.js +6 -2
  186. package/dist/esm/transport/node/helpers.js +19 -1
  187. package/dist/esm/transport/node/usync.js +3 -33
  188. package/dist/esm/transport/node/xml.js +35 -14
  189. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  190. package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
  191. package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
  192. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  193. package/dist/esm/transport/stream/parse.js +8 -4
  194. package/dist/esm/util/bytes.js +22 -18
  195. package/dist/esm/util/index.js +5 -0
  196. package/dist/esm/util/primitives.js +3 -2
  197. package/dist/index.js +7 -1
  198. package/dist/infra/perf/BackgroundQueue.js +482 -0
  199. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  200. package/dist/infra/perf/PromiseDedup.js +24 -0
  201. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  202. package/dist/infra/perf/StoreLock.js +81 -0
  203. package/dist/media/WaMediaCrypto.js +94 -12
  204. package/dist/media/WaMediaTransferClient.js +39 -47
  205. package/dist/media/constants.js +2 -1
  206. package/dist/message/WaMessageClient.js +26 -19
  207. package/dist/message/content.js +198 -9
  208. package/dist/message/icdc.js +81 -0
  209. package/dist/message/incoming.js +24 -12
  210. package/dist/message/phash.js +3 -1
  211. package/dist/message/reporting-token.js +14 -28
  212. package/dist/protocol/appstate.js +10 -41
  213. package/dist/protocol/browser.js +10 -18
  214. package/dist/protocol/constants.js +21 -2
  215. package/dist/protocol/defaults.js +6 -0
  216. package/dist/protocol/index.js +8 -5
  217. package/dist/protocol/jid.js +111 -36
  218. package/dist/protocol/message.js +62 -2
  219. package/dist/protocol/nodes.js +2 -0
  220. package/dist/protocol/notification.js +3 -1
  221. package/dist/protocol/privacy-token.js +20 -0
  222. package/dist/protocol/privacy.js +58 -0
  223. package/dist/protocol/stream.js +27 -2
  224. package/dist/retry/codec.js +220 -0
  225. package/dist/retry/constants.js +1 -1
  226. package/dist/retry/index.js +5 -5
  227. package/dist/retry/parse.js +51 -30
  228. package/dist/retry/replay.js +10 -6
  229. package/dist/retry/tracker.js +50 -12
  230. package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
  231. package/dist/signal/api/SignalDigestSyncApi.js +13 -9
  232. package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
  233. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  234. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  235. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  236. package/dist/signal/api/result-map.js +13 -0
  237. package/dist/signal/constants.js +1 -5
  238. package/dist/signal/crypto/WaAdvSignature.js +11 -5
  239. package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
  240. package/dist/signal/group/SenderKeyCodec.js +4 -3
  241. package/dist/signal/group/SenderKeyManager.js +125 -106
  242. package/dist/signal/index.js +13 -1
  243. package/dist/signal/registration/keygen.js +6 -2
  244. package/dist/signal/registration/utils.js +1 -0
  245. package/dist/signal/session/SignalProtocol.js +150 -74
  246. package/dist/signal/session/resolver.js +135 -100
  247. package/dist/store/contracts/privacy-token.store.js +2 -0
  248. package/dist/store/createStore.js +101 -187
  249. package/dist/store/index.js +15 -33
  250. package/dist/store/locks/appstate.lock.js +29 -0
  251. package/dist/store/locks/auth.lock.js +18 -0
  252. package/dist/store/locks/contact.lock.js +23 -0
  253. package/dist/store/locks/device-list.lock.js +23 -0
  254. package/dist/store/locks/message.lock.js +24 -0
  255. package/dist/store/locks/participants.lock.js +23 -0
  256. package/dist/store/locks/privacy-token.lock.js +21 -0
  257. package/dist/store/locks/retry.lock.js +32 -0
  258. package/dist/store/locks/sender-key.lock.js +55 -0
  259. package/dist/store/locks/signal.lock.js +66 -0
  260. package/dist/store/locks/thread.lock.js +24 -0
  261. package/dist/store/noop.store.js +1 -1
  262. package/dist/store/providers/memory/appstate.store.js +22 -24
  263. package/dist/store/providers/memory/device-list.store.js +10 -5
  264. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  265. package/dist/store/providers/memory/retry.store.js +77 -2
  266. package/dist/store/providers/memory/sender-key.store.js +6 -1
  267. package/dist/store/providers/memory/signal.store.js +36 -19
  268. package/dist/transport/WaComms.js +3 -1
  269. package/dist/transport/WaWebSocket.js +0 -6
  270. package/dist/transport/binary/constants.js +1 -31
  271. package/dist/transport/binary/decoder.js +4 -4
  272. package/dist/transport/binary/encoder.js +8 -15
  273. package/dist/transport/binary/index.js +0 -4
  274. package/dist/transport/node/WaNodeOrchestrator.js +24 -18
  275. package/dist/transport/node/builders/business.js +137 -0
  276. package/dist/transport/node/builders/global.js +375 -0
  277. package/dist/transport/node/builders/index.js +18 -9
  278. package/dist/transport/node/builders/message.js +64 -245
  279. package/dist/transport/node/builders/pairing.js +0 -26
  280. package/dist/transport/node/builders/privacy-token.js +46 -0
  281. package/dist/transport/node/builders/privacy.js +55 -0
  282. package/dist/transport/node/builders/profile.js +78 -0
  283. package/dist/transport/node/builders/retry.js +9 -21
  284. package/dist/transport/node/builders/usync.js +6 -2
  285. package/dist/transport/node/helpers.js +20 -1
  286. package/dist/transport/node/usync.js +2 -32
  287. package/dist/transport/node/xml.js +35 -14
  288. package/dist/transport/noise/WaClientPayload.js +13 -13
  289. package/dist/transport/noise/WaNoiseCert.js +2 -2
  290. package/dist/transport/noise/WaNoiseSession.js +64 -23
  291. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  292. package/dist/transport/stream/parse.js +7 -3
  293. package/dist/types/appstate/encoding.d.ts +7 -0
  294. package/dist/types/appstate/index.d.ts +3 -3
  295. package/dist/types/appstate/utils.d.ts +0 -2
  296. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  297. package/dist/types/auth/index.d.ts +0 -2
  298. package/dist/types/auth/types.d.ts +1 -0
  299. package/dist/types/client/WaClient.d.ts +27 -12
  300. package/dist/types/client/WaClientFactory.d.ts +12 -4
  301. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  302. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  303. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
  304. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
  305. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  306. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  307. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  308. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
  309. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  310. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  311. package/dist/types/client/events/devices.d.ts +20 -0
  312. package/dist/types/client/events/identity.d.ts +9 -0
  313. package/dist/types/client/events/privacy-token.d.ts +7 -0
  314. package/dist/types/client/history-sync.d.ts +9 -6
  315. package/dist/types/client/incoming.d.ts +3 -1
  316. package/dist/types/client/index.d.ts +1 -1
  317. package/dist/types/client/mailbox.d.ts +3 -5
  318. package/dist/types/client/messages.d.ts +1 -2
  319. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  320. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  321. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  322. package/dist/types/client/types.d.ts +51 -3
  323. package/dist/types/crypto/core/index.d.ts +2 -2
  324. package/dist/types/crypto/core/nonce.d.ts +2 -0
  325. package/dist/types/crypto/core/primitives.d.ts +0 -1
  326. package/dist/types/crypto/core/random.d.ts +1 -0
  327. package/dist/types/crypto/index.d.ts +1 -0
  328. package/dist/types/crypto/math/constants.d.ts +4 -2
  329. package/dist/types/crypto/math/fe.d.ts +30 -0
  330. package/dist/types/crypto/math/mod.d.ts +0 -2
  331. package/dist/types/crypto/math/types.d.ts +11 -4
  332. package/dist/types/index.d.ts +5 -3
  333. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  334. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  335. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  336. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  337. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  338. package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
  339. package/dist/types/media/constants.d.ts +1 -1
  340. package/dist/types/media/index.d.ts +1 -1
  341. package/dist/types/media/types.d.ts +10 -2
  342. package/dist/types/message/content.d.ts +8 -0
  343. package/dist/types/message/icdc.d.ts +13 -0
  344. package/dist/types/message/reporting-token.d.ts +0 -1
  345. package/dist/types/message/types.d.ts +45 -6
  346. package/dist/types/protocol/appstate.d.ts +0 -11
  347. package/dist/types/protocol/constants.d.ts +7 -3
  348. package/dist/types/protocol/defaults.d.ts +6 -0
  349. package/dist/types/protocol/index.d.ts +1 -2
  350. package/dist/types/protocol/jid.d.ts +19 -2
  351. package/dist/types/protocol/message.d.ts +60 -0
  352. package/dist/types/protocol/nodes.d.ts +2 -0
  353. package/dist/types/protocol/notification.d.ts +2 -0
  354. package/dist/types/protocol/privacy-token.d.ts +17 -0
  355. package/dist/types/protocol/privacy.d.ts +75 -0
  356. package/dist/types/protocol/stream.d.ts +30 -0
  357. package/dist/types/retry/codec.d.ts +3 -0
  358. package/dist/types/retry/index.d.ts +3 -3
  359. package/dist/types/retry/parse.d.ts +5 -2
  360. package/dist/types/retry/tracker.d.ts +1 -0
  361. package/dist/types/retry/types.d.ts +6 -1
  362. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  363. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  364. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  365. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  366. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  367. package/dist/types/signal/api/result-map.d.ts +1 -0
  368. package/dist/types/signal/constants.d.ts +0 -3
  369. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  370. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  371. package/dist/types/signal/index.d.ts +2 -0
  372. package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
  373. package/dist/types/signal/session/resolver.d.ts +7 -2
  374. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  375. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  376. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  377. package/dist/types/store/contracts/signal.store.d.ts +7 -0
  378. package/dist/types/store/createStore.d.ts +1 -1
  379. package/dist/types/store/index.d.ts +5 -13
  380. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  381. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  382. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  383. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  384. package/dist/types/store/locks/message.lock.d.ts +3 -0
  385. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  386. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  387. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  388. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  389. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  390. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  391. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  392. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  393. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  394. package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
  395. package/dist/types/store/types.d.ts +49 -61
  396. package/dist/types/transport/WaWebSocket.d.ts +0 -1
  397. package/dist/types/transport/binary/constants.d.ts +0 -30
  398. package/dist/types/transport/binary/index.d.ts +0 -1
  399. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  400. package/dist/types/transport/node/builders/business.d.ts +29 -0
  401. package/dist/types/transport/node/builders/global.d.ts +102 -0
  402. package/dist/types/transport/node/builders/index.d.ts +5 -2
  403. package/dist/types/transport/node/builders/message.d.ts +8 -7
  404. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  405. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  406. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  407. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  408. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  409. package/dist/types/transport/node/helpers.d.ts +5 -0
  410. package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
  411. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  412. package/dist/types/util/bytes.d.ts +1 -1
  413. package/dist/types/util/index.d.ts +5 -0
  414. package/dist/types/util/primitives.d.ts +0 -1
  415. package/dist/util/bytes.js +22 -18
  416. package/dist/util/index.js +23 -0
  417. package/dist/util/primitives.js +2 -2
  418. package/package.json +29 -7
  419. package/proto/index.js +1 -1
  420. package/dist/crypto/core/constants.js +0 -4
  421. package/dist/esm/crypto/core/constants.js +0 -1
  422. package/dist/esm/retry/outbound.js +0 -82
  423. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  424. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  425. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  426. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  427. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  428. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  429. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  430. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  431. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  432. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  433. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  434. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  435. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  436. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  437. package/dist/retry/outbound.js +0 -87
  438. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  439. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  440. package/dist/store/providers/sqlite/auth.store.js +0 -180
  441. package/dist/store/providers/sqlite/connection.js +0 -281
  442. package/dist/store/providers/sqlite/contact.store.js +0 -78
  443. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  444. package/dist/store/providers/sqlite/message.store.js +0 -136
  445. package/dist/store/providers/sqlite/migrations.js +0 -350
  446. package/dist/store/providers/sqlite/participants.store.js +0 -81
  447. package/dist/store/providers/sqlite/retry.store.js +0 -145
  448. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  449. package/dist/store/providers/sqlite/signal.store.js +0 -439
  450. package/dist/store/providers/sqlite/table-names.js +0 -113
  451. package/dist/store/providers/sqlite/thread.store.js +0 -89
  452. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  453. package/dist/types/crypto/core/constants.d.ts +0 -1
  454. package/dist/types/retry/outbound.d.ts +0 -4
  455. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  456. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  457. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  458. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  459. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  460. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  461. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  462. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  463. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  464. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  465. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  466. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  467. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  468. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
@@ -1,198 +0,0 @@
1
- import { decodeSenderKeyDistributionRow, decodeSenderKeyRecord, 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 getDeviceSenderKeyDistributions(groupId, senders) {
86
- if (senders.length === 0) {
87
- return [];
88
- }
89
- const db = await this.getConnection();
90
- const targets = senders.map((sender) => toSignalAddressParts(sender));
91
- const map = new Map();
92
- for (let start = 0; start < targets.length; start += this.distributionBatchSize) {
93
- const end = Math.min(start + this.distributionBatchSize, targets.length);
94
- const batchLength = end - start;
95
- const filters = new Array(batchLength)
96
- .fill('(sender_user = ? AND sender_server = ? AND sender_device = ?)')
97
- .join(' OR ');
98
- const params = [this.options.sessionId, groupId];
99
- for (let index = start; index < end; index += 1) {
100
- const target = targets[index];
101
- params.push(target.user, target.server, target.device);
102
- }
103
- const rows = db.all(`SELECT group_id, sender_user, sender_server, sender_device, key_id, timestamp_ms
104
- FROM sender_key_distribution
105
- WHERE session_id = ? AND group_id = ? AND (${filters})`, params);
106
- for (const row of rows) {
107
- map.set(this.distributionRowKey(row), decodeSenderKeyDistributionRow(row));
108
- }
109
- }
110
- return targets.map((target) => {
111
- return (map.get(this.distributionTargetKey(target.user, target.server, target.device)) ??
112
- null);
113
- });
114
- }
115
- async deleteDeviceSenderKey(target, groupId) {
116
- const sender = toSignalAddressParts(target);
117
- return this.withTransaction((db) => {
118
- const senderCount = this.countDelete(db, 'sender_keys', sender, groupId);
119
- const distributionCount = this.countDelete(db, 'sender_key_distribution', sender, groupId);
120
- return senderCount + distributionCount;
121
- });
122
- }
123
- async markForgetSenderKey(groupId, participants) {
124
- if (participants.length === 0) {
125
- return 0;
126
- }
127
- return this.withTransaction((db) => {
128
- let filters = '';
129
- const params = [this.options.sessionId, groupId];
130
- for (let index = 0; index < participants.length; index += 1) {
131
- if (index > 0) {
132
- filters += ' OR ';
133
- }
134
- filters += '(sender_user = ? AND sender_server = ? AND sender_device = ?)';
135
- const sender = toSignalAddressParts(participants[index]);
136
- params.push(sender.user, sender.server, sender.device);
137
- }
138
- const where = `session_id = ? AND group_id = ? AND (${filters})`;
139
- db.run(`DELETE FROM sender_keys WHERE ${where}`, params);
140
- const senderCountRow = db.get('SELECT changes() AS total', []);
141
- const senderCount = senderCountRow
142
- ? asNumber(senderCountRow.total, 'sender_keys.changes')
143
- : 0;
144
- db.run(`DELETE FROM sender_key_distribution WHERE ${where}`, params);
145
- const distributionCountRow = db.get('SELECT changes() AS total', []);
146
- const distributionCount = distributionCountRow
147
- ? asNumber(distributionCountRow.total, 'sender_key_distribution.changes')
148
- : 0;
149
- return senderCount + distributionCount;
150
- });
151
- }
152
- async clear() {
153
- await this.withTransaction((db) => {
154
- db.run('DELETE FROM sender_keys WHERE session_id = ?', [this.options.sessionId]);
155
- db.run('DELETE FROM sender_key_distribution WHERE session_id = ?', [
156
- this.options.sessionId
157
- ]);
158
- });
159
- }
160
- countDelete(db, table, target, groupId) {
161
- const whereWithGroup = 'session_id = ? AND sender_user = ? AND sender_server = ? AND sender_device = ? AND group_id = ?';
162
- const whereAllGroups = 'session_id = ? AND sender_user = ? AND sender_server = ? AND sender_device = ?';
163
- db.run(`DELETE FROM ${table}
164
- WHERE ${groupId ? whereWithGroup : whereAllGroups}`, groupId
165
- ? [this.options.sessionId, target.user, target.server, target.device, groupId]
166
- : [this.options.sessionId, target.user, target.server, target.device]);
167
- const row = db.get('SELECT changes() AS total', []);
168
- return row ? asNumber(row.total, `${table}.changes`) : 0;
169
- }
170
- upsertSenderKeyDistributionRow(db, record, sender) {
171
- db.run(`INSERT INTO sender_key_distribution (
172
- session_id,
173
- group_id,
174
- sender_user,
175
- sender_server,
176
- sender_device,
177
- key_id,
178
- timestamp_ms
179
- ) VALUES (?, ?, ?, ?, ?, ?, ?)
180
- ON CONFLICT(session_id, group_id, sender_user, sender_server, sender_device) DO UPDATE SET
181
- key_id=excluded.key_id,
182
- timestamp_ms=excluded.timestamp_ms`, [
183
- this.options.sessionId,
184
- record.groupId,
185
- sender.user,
186
- sender.server,
187
- sender.device,
188
- record.keyId,
189
- record.timestampMs
190
- ]);
191
- }
192
- distributionRowKey(row) {
193
- 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'));
194
- }
195
- distributionTargetKey(user, server, device) {
196
- return `${user}|${server}|${device}`;
197
- }
198
- }
@@ -1,435 +0,0 @@
1
- import { signalAddressKey } from '../../../protocol/jid.js';
2
- import { decodeSignalPreKeyRow, decodeSignalRegistrationRow, decodeSignalRemoteIdentity, decodeSignalSessionRecord, decodeSignalSignedPreKeyRow, encodeSignalSessionRecord, toSignalAddressParts } from '../../../signal/store/sqlite.js';
3
- import { BaseSqliteStore } from '../../providers/sqlite/BaseSqliteStore.js';
4
- import { asNumber, asOptionalNumber, asString, toBoolOrUndef, resolvePositive } from '../../../util/coercion.js';
5
- const DEFAULTS = Object.freeze({
6
- preKeyBatchSize: 500,
7
- hasSessionBatchSize: 250
8
- });
9
- function repeatSqlToken(token, count, separator) {
10
- if (count <= 1) {
11
- return token;
12
- }
13
- let out = token;
14
- for (let index = 1; index < count; index += 1) {
15
- out += separator + token;
16
- }
17
- return out;
18
- }
19
- export class WaSignalSqliteStore extends BaseSqliteStore {
20
- constructor(options, storeOptions = {}) {
21
- super(options, ['signal']);
22
- this.preKeyBatchSize = resolvePositive(storeOptions.preKeyBatchSize, DEFAULTS.preKeyBatchSize, 'signal.sqlite.preKeyBatchSize');
23
- this.hasSessionBatchSize = resolvePositive(storeOptions.hasSessionBatchSize, DEFAULTS.hasSessionBatchSize, 'signal.sqlite.hasSessionBatchSize');
24
- }
25
- async getRegistrationInfo() {
26
- const db = await this.getConnection();
27
- const row = db.get(`SELECT registration_id, identity_pub_key, identity_priv_key
28
- FROM signal_registration
29
- WHERE session_id = ?`, [this.options.sessionId]);
30
- return row ? decodeSignalRegistrationRow(row) : null;
31
- }
32
- async setRegistrationInfo(info) {
33
- const db = await this.getConnection();
34
- db.run(`INSERT INTO signal_registration (
35
- session_id,
36
- registration_id,
37
- identity_pub_key,
38
- identity_priv_key
39
- ) VALUES (?, ?, ?, ?)
40
- ON CONFLICT(session_id) DO UPDATE SET
41
- registration_id=excluded.registration_id,
42
- identity_pub_key=excluded.identity_pub_key,
43
- identity_priv_key=excluded.identity_priv_key`, [
44
- this.options.sessionId,
45
- info.registrationId,
46
- info.identityKeyPair.pubKey,
47
- info.identityKeyPair.privKey
48
- ]);
49
- }
50
- async getSignedPreKey() {
51
- const db = await this.getConnection();
52
- const row = db.get(`SELECT key_id, pub_key, priv_key, signature, uploaded
53
- FROM signal_signed_prekey
54
- WHERE session_id = ?`, [this.options.sessionId]);
55
- return row ? decodeSignalSignedPreKeyRow(row) : null;
56
- }
57
- async setSignedPreKey(record) {
58
- const db = await this.getConnection();
59
- db.run(`INSERT INTO signal_signed_prekey (
60
- session_id,
61
- key_id,
62
- pub_key,
63
- priv_key,
64
- signature,
65
- uploaded
66
- ) VALUES (?, ?, ?, ?, ?, ?)
67
- ON CONFLICT(session_id) DO UPDATE SET
68
- key_id=excluded.key_id,
69
- pub_key=excluded.pub_key,
70
- priv_key=excluded.priv_key,
71
- signature=excluded.signature,
72
- uploaded=excluded.uploaded`, [
73
- this.options.sessionId,
74
- record.keyId,
75
- record.keyPair.pubKey,
76
- record.keyPair.privKey,
77
- record.signature,
78
- record.uploaded === true ? 1 : 0
79
- ]);
80
- }
81
- async getSignedPreKeyById(keyId) {
82
- const db = await this.getConnection();
83
- const row = db.get(`SELECT key_id, pub_key, priv_key, signature, uploaded
84
- FROM signal_signed_prekey
85
- WHERE session_id = ? AND key_id = ?`, [this.options.sessionId, keyId]);
86
- return row ? decodeSignalSignedPreKeyRow(row) : null;
87
- }
88
- async setSignedPreKeyRotationTs(value) {
89
- const db = await this.getConnection();
90
- this.ensureMetaRow(db);
91
- db.run(`UPDATE signal_meta
92
- SET signed_prekey_rotation_ts = ?
93
- WHERE session_id = ?`, [value, this.options.sessionId]);
94
- }
95
- async getSignedPreKeyRotationTs() {
96
- const db = await this.getConnection();
97
- const meta = this.getMeta(db);
98
- return meta.signedPreKeyRotationTs;
99
- }
100
- async putPreKey(record) {
101
- const db = await this.getConnection();
102
- this.ensureMetaRow(db);
103
- this.upsertPreKey(db, record);
104
- db.run(`UPDATE signal_meta
105
- SET next_prekey_id = MAX(next_prekey_id, ?)
106
- WHERE session_id = ?`, [record.keyId + 1, this.options.sessionId]);
107
- }
108
- async getOrGenPreKeys(count, generator) {
109
- if (!Number.isSafeInteger(count) || count <= 0) {
110
- throw new Error(`invalid prekey count: ${count}`);
111
- }
112
- return this.withTransaction(async (db) => {
113
- this.ensureMetaRow(db);
114
- const available = db
115
- .all(`SELECT key_id, pub_key, priv_key, uploaded
116
- FROM signal_prekey
117
- WHERE session_id = ? AND uploaded = 0
118
- ORDER BY key_id ASC
119
- LIMIT ?`, [this.options.sessionId, count])
120
- .map((row) => decodeSignalPreKeyRow(row));
121
- if (available.length < count) {
122
- let nextPreKeyId = this.getMeta(db).nextPreKeyId;
123
- while (available.length < count) {
124
- const requestedKeyId = nextPreKeyId;
125
- const generated = await generator(requestedKeyId);
126
- this.upsertPreKey(db, generated);
127
- available.push(generated);
128
- nextPreKeyId = Math.max(requestedKeyId + 1, generated.keyId + 1);
129
- }
130
- db.run(`UPDATE signal_meta
131
- SET next_prekey_id = ?
132
- WHERE session_id = ?`, [nextPreKeyId, this.options.sessionId]);
133
- }
134
- return available;
135
- });
136
- }
137
- async getPreKeyById(keyId) {
138
- const db = await this.getConnection();
139
- const row = db.get(`SELECT key_id, pub_key, priv_key, uploaded
140
- FROM signal_prekey
141
- WHERE session_id = ? AND key_id = ?`, [this.options.sessionId, keyId]);
142
- return row ? decodeSignalPreKeyRow(row) : null;
143
- }
144
- async getPreKeysById(keyIds) {
145
- if (keyIds.length === 0) {
146
- return [];
147
- }
148
- const db = await this.getConnection();
149
- const uniqueKeyIds = [...new Set(keyIds)];
150
- const byId = new Map();
151
- for (let start = 0; start < uniqueKeyIds.length; start += this.preKeyBatchSize) {
152
- const end = Math.min(start + this.preKeyBatchSize, uniqueKeyIds.length);
153
- const batchLength = end - start;
154
- const placeholders = repeatSqlToken('?', batchLength, ', ');
155
- const params = [this.options.sessionId];
156
- for (let index = start; index < end; index += 1) {
157
- params.push(uniqueKeyIds[index]);
158
- }
159
- const rows = db.all(`SELECT key_id, pub_key, priv_key, uploaded
160
- FROM signal_prekey
161
- WHERE session_id = ? AND key_id IN (${placeholders})`, params);
162
- for (const row of rows) {
163
- const record = decodeSignalPreKeyRow(row);
164
- byId.set(record.keyId, record);
165
- }
166
- }
167
- return keyIds.map((keyId) => byId.get(keyId) ?? null);
168
- }
169
- async consumePreKeyById(keyId) {
170
- return this.withTransaction((db) => {
171
- const row = db.get(`SELECT key_id, pub_key, priv_key, uploaded
172
- FROM signal_prekey
173
- WHERE session_id = ? AND key_id = ?`, [this.options.sessionId, keyId]);
174
- if (!row) {
175
- return null;
176
- }
177
- db.run(`DELETE FROM signal_prekey
178
- WHERE session_id = ? AND key_id = ?`, [this.options.sessionId, keyId]);
179
- return decodeSignalPreKeyRow(row);
180
- });
181
- }
182
- async getOrGenSinglePreKey(generator) {
183
- const records = await this.getOrGenPreKeys(1, generator);
184
- return records[0];
185
- }
186
- async markKeyAsUploaded(keyId) {
187
- const db = await this.getConnection();
188
- const meta = this.getMeta(db);
189
- if (keyId < 0 || keyId >= meta.nextPreKeyId) {
190
- throw new Error(`prekey ${keyId} is out of boundary`);
191
- }
192
- db.run(`UPDATE signal_prekey
193
- SET uploaded = 1
194
- WHERE session_id = ? AND key_id <= ?`, [this.options.sessionId, keyId]);
195
- }
196
- async setServerHasPreKeys(value) {
197
- const db = await this.getConnection();
198
- this.ensureMetaRow(db);
199
- db.run(`UPDATE signal_meta
200
- SET server_has_prekeys = ?
201
- WHERE session_id = ?`, [value ? 1 : 0, this.options.sessionId]);
202
- }
203
- async getServerHasPreKeys() {
204
- const db = await this.getConnection();
205
- const meta = this.getMeta(db);
206
- return meta.serverHasPreKeys;
207
- }
208
- async hasSession(address) {
209
- const db = await this.getConnection();
210
- const target = toSignalAddressParts(address);
211
- return (db.get(`SELECT 1 AS has_session
212
- FROM signal_session
213
- WHERE session_id = ? AND user = ? AND server = ? AND device = ?
214
- LIMIT 1`, [this.options.sessionId, target.user, target.server, target.device]) !== null);
215
- }
216
- async hasSessions(addresses) {
217
- if (addresses.length === 0) {
218
- return [];
219
- }
220
- const db = await this.getConnection();
221
- const targets = addresses.map((address) => toSignalAddressParts(address));
222
- const existingKeys = new Set();
223
- for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
224
- const end = Math.min(start + this.hasSessionBatchSize, targets.length);
225
- const batchLength = end - start;
226
- const filters = repeatSqlToken('(user = ? AND server = ? AND device = ?)', batchLength, ' OR ');
227
- const params = [this.options.sessionId];
228
- for (let index = start; index < end; index += 1) {
229
- const target = targets[index];
230
- params.push(target.user, target.server, target.device);
231
- }
232
- const rows = db.all(`SELECT user, server, device
233
- FROM signal_session
234
- WHERE session_id = ? AND (${filters})`, params);
235
- for (const row of rows) {
236
- existingKeys.add(signalAddressKey({
237
- user: asString(row.user, 'signal_session.user'),
238
- server: asString(row.server, 'signal_session.server'),
239
- device: asNumber(row.device, 'signal_session.device')
240
- }));
241
- }
242
- }
243
- return targets.map((target) => existingKeys.has(signalAddressKey(target)));
244
- }
245
- async getSession(address) {
246
- const db = await this.getConnection();
247
- const target = toSignalAddressParts(address);
248
- const row = db.get(`SELECT user, server, device, record
249
- FROM signal_session
250
- WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
251
- return row ? decodeSignalSessionRecord(row.record) : null;
252
- }
253
- async getSessionsBatch(addresses) {
254
- if (addresses.length === 0) {
255
- return [];
256
- }
257
- const db = await this.getConnection();
258
- const targets = addresses.map((address) => toSignalAddressParts(address));
259
- const byAddressKey = new Map();
260
- for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
261
- const end = Math.min(start + this.hasSessionBatchSize, targets.length);
262
- const batchLength = end - start;
263
- const filters = repeatSqlToken('(user = ? AND server = ? AND device = ?)', batchLength, ' OR ');
264
- const params = [this.options.sessionId];
265
- for (let index = start; index < end; index += 1) {
266
- const target = targets[index];
267
- params.push(target.user, target.server, target.device);
268
- }
269
- const rows = db.all(`SELECT user, server, device, record
270
- FROM signal_session
271
- WHERE session_id = ? AND (${filters})`, params);
272
- for (const row of rows) {
273
- byAddressKey.set(signalAddressKey({
274
- user: asString(row.user, 'signal_session.user'),
275
- server: asString(row.server, 'signal_session.server'),
276
- device: asNumber(row.device, 'signal_session.device')
277
- }), decodeSignalSessionRecord(row.record));
278
- }
279
- }
280
- return targets.map((target) => byAddressKey.get(signalAddressKey(target)) ?? null);
281
- }
282
- async setSession(address, session) {
283
- const db = await this.getConnection();
284
- const target = toSignalAddressParts(address);
285
- this.upsertSession(db, target, session);
286
- }
287
- async setSessionsBatch(entries) {
288
- if (entries.length === 0) {
289
- return;
290
- }
291
- await this.withTransaction((db) => {
292
- for (let index = 0; index < entries.length; index += 1) {
293
- const entry = entries[index];
294
- this.upsertSession(db, toSignalAddressParts(entry.address), entry.session);
295
- }
296
- });
297
- }
298
- async deleteSession(address) {
299
- const db = await this.getConnection();
300
- const target = toSignalAddressParts(address);
301
- db.run(`DELETE FROM signal_session
302
- WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
303
- }
304
- async getRemoteIdentity(address) {
305
- const db = await this.getConnection();
306
- const target = toSignalAddressParts(address);
307
- const row = db.get(`SELECT identity_key
308
- FROM signal_identity
309
- WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
310
- return row ? decodeSignalRemoteIdentity(row.identity_key) : null;
311
- }
312
- async getRemoteIdentities(addresses) {
313
- if (addresses.length === 0) {
314
- return [];
315
- }
316
- const db = await this.getConnection();
317
- const targets = addresses.map((address) => toSignalAddressParts(address));
318
- const byAddressKey = new Map();
319
- for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
320
- const end = Math.min(start + this.hasSessionBatchSize, targets.length);
321
- const batchLength = end - start;
322
- const filters = repeatSqlToken('(user = ? AND server = ? AND device = ?)', batchLength, ' OR ');
323
- const params = [this.options.sessionId];
324
- for (let index = start; index < end; index += 1) {
325
- const target = targets[index];
326
- params.push(target.user, target.server, target.device);
327
- }
328
- const rows = db.all(`SELECT user, server, device, identity_key
329
- FROM signal_identity
330
- WHERE session_id = ? AND (${filters})`, params);
331
- for (const row of rows) {
332
- byAddressKey.set(signalAddressKey({
333
- user: asString(row.user, 'signal_identity.user'),
334
- server: asString(row.server, 'signal_identity.server'),
335
- device: asNumber(row.device, 'signal_identity.device')
336
- }), decodeSignalRemoteIdentity(row.identity_key));
337
- }
338
- }
339
- return targets.map((target) => byAddressKey.get(signalAddressKey(target)) ?? null);
340
- }
341
- async setRemoteIdentity(address, identityKey) {
342
- const db = await this.getConnection();
343
- const target = toSignalAddressParts(address);
344
- this.upsertRemoteIdentity(db, target, identityKey);
345
- }
346
- async setRemoteIdentities(entries) {
347
- if (entries.length === 0) {
348
- return;
349
- }
350
- await this.withTransaction((db) => {
351
- for (const entry of entries) {
352
- const target = toSignalAddressParts(entry.address);
353
- this.upsertRemoteIdentity(db, target, entry.identityKey);
354
- }
355
- });
356
- }
357
- async clear() {
358
- await this.withTransaction((db) => {
359
- db.run('DELETE FROM signal_registration WHERE session_id = ?', [this.options.sessionId]);
360
- db.run('DELETE FROM signal_signed_prekey WHERE session_id = ?', [
361
- this.options.sessionId
362
- ]);
363
- db.run('DELETE FROM signal_prekey WHERE session_id = ?', [this.options.sessionId]);
364
- db.run('DELETE FROM signal_session WHERE session_id = ?', [this.options.sessionId]);
365
- db.run('DELETE FROM signal_identity WHERE session_id = ?', [this.options.sessionId]);
366
- db.run('DELETE FROM signal_meta WHERE session_id = ?', [this.options.sessionId]);
367
- });
368
- }
369
- upsertPreKey(db, record) {
370
- db.run(`INSERT INTO signal_prekey (
371
- session_id,
372
- key_id,
373
- pub_key,
374
- priv_key,
375
- uploaded
376
- ) VALUES (?, ?, ?, ?, ?)
377
- ON CONFLICT(session_id, key_id) DO UPDATE SET
378
- pub_key=excluded.pub_key,
379
- priv_key=excluded.priv_key,
380
- uploaded=excluded.uploaded`, [
381
- this.options.sessionId,
382
- record.keyId,
383
- record.keyPair.pubKey,
384
- record.keyPair.privKey,
385
- record.uploaded === true ? 1 : 0
386
- ]);
387
- }
388
- upsertSession(db, target, session) {
389
- db.run(`INSERT INTO signal_session (
390
- session_id,
391
- user,
392
- server,
393
- device,
394
- record
395
- ) VALUES (?, ?, ?, ?, ?)
396
- ON CONFLICT(session_id, user, server, device) DO UPDATE SET
397
- record=excluded.record`, [
398
- this.options.sessionId,
399
- target.user,
400
- target.server,
401
- target.device,
402
- encodeSignalSessionRecord(session)
403
- ]);
404
- }
405
- ensureMetaRow(db) {
406
- db.run(`INSERT INTO signal_meta (
407
- session_id,
408
- server_has_prekeys,
409
- next_prekey_id
410
- ) VALUES (?, 0, 1)
411
- ON CONFLICT(session_id) DO NOTHING`, [this.options.sessionId]);
412
- }
413
- getMeta(db) {
414
- this.ensureMetaRow(db);
415
- const row = db.get(`SELECT server_has_prekeys, next_prekey_id, signed_prekey_rotation_ts
416
- FROM signal_meta
417
- WHERE session_id = ?`, [this.options.sessionId]);
418
- return {
419
- serverHasPreKeys: toBoolOrUndef(row.server_has_prekeys) === true,
420
- nextPreKeyId: asNumber(row.next_prekey_id, 'signal_meta.next_prekey_id'),
421
- signedPreKeyRotationTs: asOptionalNumber(row.signed_prekey_rotation_ts, 'signal_meta.signed_prekey_rotation_ts') ?? null
422
- };
423
- }
424
- upsertRemoteIdentity(db, target, identityKey) {
425
- db.run(`INSERT INTO signal_identity (
426
- session_id,
427
- user,
428
- server,
429
- device,
430
- identity_key
431
- ) VALUES (?, ?, ?, ?, ?)
432
- ON CONFLICT(session_id, user, server, device) DO UPDATE SET
433
- identity_key=excluded.identity_key`, [this.options.sessionId, target.user, target.server, target.device, identityKey]);
434
- }
435
- }