zapo-js 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/README.md +8 -0
  2. package/dist/appstate/WaAppStateCrypto.js +18 -25
  3. package/dist/appstate/WaAppStateSyncClient.js +181 -114
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/utils.js +10 -30
  7. package/dist/auth/WaAuthClient.js +48 -55
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
  9. package/dist/auth/index.js +1 -3
  10. package/dist/auth/pairing/WaPairingFlow.js +21 -23
  11. package/dist/auth/pairing/WaQrFlow.js +37 -24
  12. package/dist/client/WaClient.js +103 -276
  13. package/dist/client/WaClientFactory.js +227 -110
  14. package/dist/client/connection/WaConnectionManager.js +292 -0
  15. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  16. package/dist/client/connection/WaReceiptQueue.js +51 -0
  17. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
  21. package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
  22. package/dist/client/dirty.js +35 -29
  23. package/dist/client/events/chat.js +4 -3
  24. package/dist/client/events/group.js +59 -36
  25. package/dist/client/history-sync.js +53 -63
  26. package/dist/client/incoming.js +23 -20
  27. package/dist/client/mailbox.js +8 -8
  28. package/dist/client/messages.js +4 -4
  29. package/dist/client/messaging/fanout.js +189 -0
  30. package/dist/client/messaging/key-protocol.js +130 -0
  31. package/dist/client/messaging/participants.js +191 -0
  32. package/dist/crypto/core/hkdf.js +3 -8
  33. package/dist/crypto/core/index.js +1 -4
  34. package/dist/crypto/core/keys.js +2 -3
  35. package/dist/crypto/core/primitives.js +12 -15
  36. package/dist/crypto/core/random.js +7 -26
  37. package/dist/crypto/curves/Ed25519.js +7 -8
  38. package/dist/crypto/curves/X25519.js +13 -16
  39. package/dist/crypto/index.js +0 -5
  40. package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
  41. package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
  42. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  43. package/dist/esm/appstate/constants.js +3 -2
  44. package/dist/esm/appstate/utils.js +8 -27
  45. package/dist/esm/auth/WaAuthClient.js +48 -55
  46. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
  47. package/dist/esm/auth/index.js +0 -1
  48. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
  49. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  50. package/dist/esm/client/WaClient.js +103 -276
  51. package/dist/esm/client/WaClientFactory.js +227 -110
  52. package/dist/esm/client/connection/WaConnectionManager.js +288 -0
  53. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  54. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  55. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  56. package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
  57. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  58. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
  59. package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
  60. package/dist/esm/client/dirty.js +30 -24
  61. package/dist/esm/client/events/chat.js +4 -3
  62. package/dist/esm/client/events/group.js +50 -28
  63. package/dist/esm/client/history-sync.js +50 -60
  64. package/dist/esm/client/incoming.js +23 -20
  65. package/dist/esm/client/mailbox.js +8 -8
  66. package/dist/esm/client/messages.js +1 -1
  67. package/dist/esm/client/messaging/fanout.js +186 -0
  68. package/dist/esm/client/messaging/key-protocol.js +127 -0
  69. package/dist/esm/client/messaging/participants.js +188 -0
  70. package/dist/esm/crypto/core/hkdf.js +3 -8
  71. package/dist/esm/crypto/core/index.js +0 -1
  72. package/dist/esm/crypto/core/keys.js +2 -3
  73. package/dist/esm/crypto/core/primitives.js +12 -15
  74. package/dist/esm/crypto/core/random.js +6 -25
  75. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  76. package/dist/esm/crypto/curves/X25519.js +10 -13
  77. package/dist/esm/crypto/index.js +0 -2
  78. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  79. package/dist/esm/infra/log/PinoLogger.js +15 -9
  80. package/dist/esm/infra/log/types.js +11 -1
  81. package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
  82. package/dist/esm/media/WaMediaCrypto.js +2 -4
  83. package/dist/esm/media/WaMediaTransferClient.js +226 -58
  84. package/dist/esm/media/conn.js +10 -6
  85. package/dist/esm/media/constants.js +4 -1
  86. package/dist/esm/message/WaMessageClient.js +4 -13
  87. package/dist/esm/message/ack.js +6 -6
  88. package/dist/esm/message/addon-crypto.js +59 -0
  89. package/dist/esm/message/incoming.js +106 -111
  90. package/dist/esm/message/index.js +2 -0
  91. package/dist/esm/message/reporting-token.js +438 -0
  92. package/dist/esm/message/use-case-secret.js +49 -0
  93. package/dist/esm/protocol/appstate.js +58 -0
  94. package/dist/esm/protocol/constants.js +2 -1
  95. package/dist/esm/protocol/index.js +2 -10
  96. package/dist/esm/protocol/jid.js +63 -51
  97. package/dist/esm/protocol/media.js +3 -3
  98. package/dist/esm/protocol/nodes.js +2 -0
  99. package/dist/esm/protocol/usync.js +11 -0
  100. package/dist/esm/retry/index.js +1 -0
  101. package/dist/esm/retry/outbound.js +4 -5
  102. package/dist/esm/retry/parse.js +58 -76
  103. package/dist/esm/retry/replay.js +48 -49
  104. package/dist/esm/retry/tracker.js +56 -0
  105. package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
  106. package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
  107. package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
  108. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
  109. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
  110. package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
  111. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  112. package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
  113. package/dist/esm/signal/group/SenderKeyManager.js +26 -16
  114. package/dist/esm/signal/index.js +1 -0
  115. package/dist/esm/signal/session/SignalProtocol.js +49 -14
  116. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  117. package/dist/esm/signal/session/SignalSession.js +14 -9
  118. package/dist/esm/signal/session/resolver.js +186 -0
  119. package/dist/esm/signal/store/sqlite.js +16 -37
  120. package/dist/esm/store/createStore.js +16 -18
  121. package/dist/esm/store/noop.store.js +3 -6
  122. package/dist/esm/store/providers/memory/appstate.store.js +30 -6
  123. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  124. package/dist/esm/store/providers/memory/device-list.store.js +3 -30
  125. package/dist/esm/store/providers/memory/message.store.js +11 -5
  126. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  127. package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
  128. package/dist/esm/store/providers/memory/signal.store.js +13 -1
  129. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  130. package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
  131. package/dist/esm/store/providers/sqlite/connection.js +18 -13
  132. package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
  133. package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
  134. package/dist/esm/store/providers/sqlite/message.store.js +45 -32
  135. package/dist/esm/store/providers/sqlite/migrations.js +1 -1
  136. package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
  137. package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
  138. package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
  139. package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
  140. package/dist/esm/store/providers/sqlite/table-names.js +107 -0
  141. package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
  142. package/dist/esm/transport/WaComms.js +25 -23
  143. package/dist/esm/transport/WaWebSocket.js +115 -12
  144. package/dist/esm/transport/binary/decoder.js +4 -4
  145. package/dist/esm/transport/binary/encoder.js +12 -4
  146. package/dist/esm/transport/index.js +1 -0
  147. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  148. package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
  149. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  150. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  151. package/dist/esm/transport/node/builders/index.js +2 -1
  152. package/dist/esm/transport/node/builders/message.js +9 -0
  153. package/dist/esm/transport/node/builders/pairing.js +4 -5
  154. package/dist/esm/transport/node/builders/usync.js +41 -0
  155. package/dist/esm/transport/node/helpers.js +107 -5
  156. package/dist/esm/transport/node/usync.js +35 -0
  157. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  158. package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
  159. package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
  160. package/dist/esm/transport/proxy.js +27 -0
  161. package/dist/esm/transport/stream/parse.js +13 -48
  162. package/dist/esm/util/bytes.js +50 -32
  163. package/dist/esm/util/coercion.js +6 -14
  164. package/dist/esm/util/primitives.js +39 -14
  165. package/dist/infra/log/ConsoleLogger.js +18 -17
  166. package/dist/infra/log/PinoLogger.js +15 -9
  167. package/dist/infra/log/types.js +12 -0
  168. package/dist/infra/perf/BoundedTaskQueue.js +13 -17
  169. package/dist/media/WaMediaCrypto.js +1 -3
  170. package/dist/media/WaMediaTransferClient.js +259 -58
  171. package/dist/media/conn.js +10 -6
  172. package/dist/media/constants.js +4 -1
  173. package/dist/message/WaMessageClient.js +5 -14
  174. package/dist/message/ack.js +6 -6
  175. package/dist/message/addon-crypto.js +65 -0
  176. package/dist/message/incoming.js +104 -109
  177. package/dist/message/index.js +2 -0
  178. package/dist/message/reporting-token.js +443 -0
  179. package/dist/message/use-case-secret.js +55 -0
  180. package/dist/protocol/appstate.js +59 -1
  181. package/dist/protocol/constants.js +7 -1
  182. package/dist/protocol/index.js +20 -42
  183. package/dist/protocol/jid.js +64 -51
  184. package/dist/protocol/media.js +3 -3
  185. package/dist/protocol/nodes.js +2 -0
  186. package/dist/protocol/usync.js +14 -0
  187. package/dist/retry/index.js +3 -1
  188. package/dist/retry/outbound.js +6 -7
  189. package/dist/retry/parse.js +57 -75
  190. package/dist/retry/replay.js +46 -47
  191. package/dist/retry/tracker.js +59 -0
  192. package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
  193. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  194. package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
  195. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
  196. package/dist/signal/api/SignalSessionSyncApi.js +23 -30
  197. package/dist/signal/crypto/WaAdvSignature.js +2 -4
  198. package/dist/signal/group/SenderKeyChain.js +27 -22
  199. package/dist/signal/group/SenderKeyCodec.js +1 -3
  200. package/dist/signal/group/SenderKeyManager.js +26 -16
  201. package/dist/signal/index.js +3 -1
  202. package/dist/signal/session/SignalProtocol.js +49 -14
  203. package/dist/signal/session/SignalRatchet.js +24 -15
  204. package/dist/signal/session/SignalSession.js +14 -9
  205. package/dist/signal/session/resolver.js +189 -0
  206. package/dist/signal/store/sqlite.js +16 -37
  207. package/dist/store/createStore.js +16 -18
  208. package/dist/store/noop.store.js +3 -6
  209. package/dist/store/providers/memory/appstate.store.js +28 -4
  210. package/dist/store/providers/memory/contact.store.js +5 -0
  211. package/dist/store/providers/memory/device-list.store.js +3 -30
  212. package/dist/store/providers/memory/message.store.js +11 -5
  213. package/dist/store/providers/memory/participants.store.js +1 -8
  214. package/dist/store/providers/memory/sender-key.store.js +8 -10
  215. package/dist/store/providers/memory/signal.store.js +21 -9
  216. package/dist/store/providers/memory/thread.store.js +5 -0
  217. package/dist/store/providers/sqlite/appstate.store.js +81 -0
  218. package/dist/store/providers/sqlite/connection.js +18 -13
  219. package/dist/store/providers/sqlite/contact.store.js +31 -18
  220. package/dist/store/providers/sqlite/device-list.store.js +7 -35
  221. package/dist/store/providers/sqlite/message.store.js +45 -32
  222. package/dist/store/providers/sqlite/migrations.js +1 -1
  223. package/dist/store/providers/sqlite/participants.store.js +1 -9
  224. package/dist/store/providers/sqlite/retry.store.js +8 -11
  225. package/dist/store/providers/sqlite/sender-key.store.js +24 -29
  226. package/dist/store/providers/sqlite/signal.store.js +105 -23
  227. package/dist/store/providers/sqlite/table-names.js +113 -0
  228. package/dist/store/providers/sqlite/thread.store.js +35 -22
  229. package/dist/transport/WaComms.js +27 -25
  230. package/dist/transport/WaWebSocket.js +148 -12
  231. package/dist/transport/binary/decoder.js +4 -4
  232. package/dist/transport/binary/encoder.js +12 -4
  233. package/dist/transport/index.js +7 -1
  234. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  235. package/dist/transport/node/WaNodeOrchestrator.js +2 -4
  236. package/dist/transport/node/WaNodeTransport.js +0 -3
  237. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  238. package/dist/transport/node/builders/index.js +12 -9
  239. package/dist/transport/node/builders/message.js +9 -0
  240. package/dist/transport/node/builders/pairing.js +4 -5
  241. package/dist/transport/node/builders/usync.js +45 -0
  242. package/dist/transport/node/helpers.js +112 -4
  243. package/dist/transport/node/usync.js +38 -0
  244. package/dist/transport/noise/WaFrameCodec.js +47 -32
  245. package/dist/transport/noise/WaNoiseCert.js +5 -8
  246. package/dist/transport/noise/WaNoiseSession.js +17 -10
  247. package/dist/transport/proxy.js +34 -0
  248. package/dist/transport/stream/parse.js +17 -53
  249. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  250. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  251. package/dist/types/appstate/constants.d.ts +1 -0
  252. package/dist/types/appstate/store/sqlite.d.ts +4 -18
  253. package/dist/types/appstate/utils.d.ts +0 -1
  254. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  255. package/dist/types/auth/index.d.ts +0 -2
  256. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  257. package/dist/types/auth/types.d.ts +6 -9
  258. package/dist/types/client/WaClient.d.ts +27 -25
  259. package/dist/types/client/WaClientFactory.d.ts +22 -23
  260. package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
  261. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  262. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  263. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  264. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
  265. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
  266. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
  267. package/dist/types/client/dirty.d.ts +1 -0
  268. package/dist/types/client/events/group.d.ts +2 -1
  269. package/dist/types/client/index.d.ts +1 -1
  270. package/dist/types/client/messaging/fanout.d.ts +14 -0
  271. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  272. package/dist/types/client/messaging/participants.d.ts +13 -0
  273. package/dist/types/client/types.d.ts +24 -1
  274. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  275. package/dist/types/crypto/core/index.d.ts +0 -1
  276. package/dist/types/crypto/core/random.d.ts +1 -7
  277. package/dist/types/crypto/index.d.ts +0 -2
  278. package/dist/types/index.d.ts +1 -1
  279. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  280. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  281. package/dist/types/infra/log/types.d.ts +1 -0
  282. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  283. package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
  284. package/dist/types/media/types.d.ts +5 -0
  285. package/dist/types/message/addon-crypto.d.ts +25 -0
  286. package/dist/types/message/index.d.ts +2 -0
  287. package/dist/types/message/reporting-token.d.ts +19 -0
  288. package/dist/types/message/use-case-secret.d.ts +20 -0
  289. package/dist/types/protocol/appstate.d.ts +58 -0
  290. package/dist/types/protocol/constants.d.ts +2 -1
  291. package/dist/types/protocol/index.d.ts +2 -10
  292. package/dist/types/protocol/jid.d.ts +3 -3
  293. package/dist/types/protocol/nodes.d.ts +2 -0
  294. package/dist/types/protocol/usync.d.ts +11 -0
  295. package/dist/types/retry/index.d.ts +1 -0
  296. package/dist/types/retry/replay.d.ts +0 -4
  297. package/dist/types/retry/tracker.d.ts +19 -0
  298. package/dist/types/retry/types.d.ts +4 -3
  299. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
  300. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  301. package/dist/types/signal/index.d.ts +1 -0
  302. package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
  303. package/dist/types/signal/session/resolver.d.ts +17 -0
  304. package/dist/types/store/contracts/appstate.store.d.ts +3 -0
  305. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  306. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  307. package/dist/types/store/contracts/message.store.d.ts +1 -0
  308. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  309. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  310. package/dist/types/store/contracts/signal.store.d.ts +6 -0
  311. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  312. package/dist/types/store/index.d.ts +1 -1
  313. package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
  314. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  315. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  316. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  317. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  318. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  319. package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
  320. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  321. package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
  322. package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
  323. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
  324. package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
  325. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
  326. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
  327. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
  328. package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
  329. package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
  330. package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
  331. package/dist/types/store/types.d.ts +3 -0
  332. package/dist/types/transport/WaWebSocket.d.ts +3 -0
  333. package/dist/types/transport/index.d.ts +2 -1
  334. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  335. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  336. package/dist/types/transport/node/builders/group.d.ts +4 -6
  337. package/dist/types/transport/node/builders/index.d.ts +2 -1
  338. package/dist/types/transport/node/builders/message.d.ts +14 -25
  339. package/dist/types/transport/node/builders/retry.d.ts +2 -4
  340. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  341. package/dist/types/transport/node/helpers.d.ts +8 -0
  342. package/dist/types/transport/node/usync.d.ts +2 -0
  343. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  344. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
  345. package/dist/types/transport/proxy.d.ts +6 -0
  346. package/dist/types/transport/stream/parse.d.ts +0 -1
  347. package/dist/types/transport/types.d.ts +18 -1
  348. package/dist/types/util/bytes.d.ts +5 -0
  349. package/dist/types/util/primitives.d.ts +3 -0
  350. package/dist/util/bytes.js +55 -33
  351. package/dist/util/coercion.js +6 -14
  352. package/dist/util/primitives.js +42 -14
  353. package/package.json +26 -5
  354. package/dist/crypto/core/encoding.js +0 -29
  355. package/dist/esm/crypto/core/encoding.js +0 -25
  356. package/dist/esm/util/base64.js +0 -18
  357. package/dist/esm/util/signal-address.js +0 -5
  358. package/dist/types/crypto/core/encoding.d.ts +0 -11
  359. package/dist/types/util/base64.d.ts +0 -4
  360. package/dist/types/util/signal-address.d.ts +0 -2
  361. package/dist/util/base64.js +0 -24
  362. package/dist/util/signal-address.js +0 -8
  363. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -85,18 +85,6 @@ class SenderKeySqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
85
85
  device: (0, coercion_1.asNumber)(row.sender_device, 'sender_keys.sender_device')
86
86
  });
87
87
  }
88
- async getDeviceSenderKeyDistribution(groupId, sender) {
89
- const db = await this.getConnection();
90
- const target = (0, sqlite_1.toSignalAddressParts)(sender);
91
- const row = db.get(`SELECT group_id, sender_user, sender_server, sender_device, key_id, timestamp_ms
92
- FROM sender_key_distribution
93
- WHERE session_id = ?
94
- AND group_id = ?
95
- AND sender_user = ?
96
- AND sender_server = ?
97
- AND sender_device = ?`, [this.options.sessionId, groupId, target.user, target.server, target.device]);
98
- return row ? (0, sqlite_1.decodeSenderKeyDistributionRow)(row) : null;
99
- }
100
88
  async getDeviceSenderKeyDistributions(groupId, senders) {
101
89
  if (senders.length === 0) {
102
90
  return [];
@@ -139,14 +127,29 @@ class SenderKeySqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
139
127
  if (participants.length === 0) {
140
128
  return 0;
141
129
  }
142
- return this.withTransaction(async (db) => {
143
- let deleted = 0;
144
- for (const participant of participants) {
145
- const sender = (0, sqlite_1.toSignalAddressParts)(participant);
146
- deleted += this.countDelete(db, 'sender_keys', sender, groupId);
147
- deleted += this.countDelete(db, 'sender_key_distribution', sender, groupId);
130
+ return this.withTransaction((db) => {
131
+ let filters = '';
132
+ const params = [this.options.sessionId, groupId];
133
+ for (let index = 0; index < participants.length; index += 1) {
134
+ if (index > 0) {
135
+ filters += ' OR ';
136
+ }
137
+ filters += '(sender_user = ? AND sender_server = ? AND sender_device = ?)';
138
+ const sender = (0, sqlite_1.toSignalAddressParts)(participants[index]);
139
+ params.push(sender.user, sender.server, sender.device);
148
140
  }
149
- return deleted;
141
+ const where = `session_id = ? AND group_id = ? AND (${filters})`;
142
+ db.run(`DELETE FROM sender_keys WHERE ${where}`, params);
143
+ const senderCountRow = db.get('SELECT changes() AS total', []);
144
+ const senderCount = senderCountRow
145
+ ? (0, coercion_1.asNumber)(senderCountRow.total, 'sender_keys.changes')
146
+ : 0;
147
+ db.run(`DELETE FROM sender_key_distribution WHERE ${where}`, params);
148
+ const distributionCountRow = db.get('SELECT changes() AS total', []);
149
+ const distributionCount = distributionCountRow
150
+ ? (0, coercion_1.asNumber)(distributionCountRow.total, 'sender_key_distribution.changes')
151
+ : 0;
152
+ return senderCount + distributionCount;
150
153
  });
151
154
  }
152
155
  async clear() {
@@ -160,20 +163,12 @@ class SenderKeySqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
160
163
  countDelete(db, table, target, groupId) {
161
164
  const whereWithGroup = 'session_id = ? AND sender_user = ? AND sender_server = ? AND sender_device = ? AND group_id = ?';
162
165
  const whereAllGroups = 'session_id = ? AND sender_user = ? AND sender_server = ? AND sender_device = ?';
163
- const countRow = db.get(`SELECT COUNT(*) AS count
164
- FROM ${table}
165
- WHERE ${groupId ? whereWithGroup : whereAllGroups}`, groupId
166
- ? [this.options.sessionId, target.user, target.server, target.device, groupId]
167
- : [this.options.sessionId, target.user, target.server, target.device]);
168
- const count = (0, sqlite_1.decodeSqliteCount)(countRow, `${table}.count`);
169
- if (count === 0) {
170
- return 0;
171
- }
172
166
  db.run(`DELETE FROM ${table}
173
167
  WHERE ${groupId ? whereWithGroup : whereAllGroups}`, groupId
174
168
  ? [this.options.sessionId, target.user, target.server, target.device, groupId]
175
169
  : [this.options.sessionId, target.user, target.server, target.device]);
176
- return count;
170
+ const row = db.get('SELECT changes() AS total', []);
171
+ return row ? (0, coercion_1.asNumber)(row.total, `${table}.changes`) : 0;
177
172
  }
178
173
  upsertSenderKeyDistributionRow(db, record, sender) {
179
174
  db.run(`INSERT INTO sender_key_distribution (
@@ -1,14 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaSignalSqliteStore = void 0;
4
+ const jid_1 = require("../../../protocol/jid");
4
5
  const sqlite_1 = require("../../../signal/store/sqlite");
5
6
  const BaseSqliteStore_1 = require("../../providers/sqlite/BaseSqliteStore");
6
7
  const coercion_1 = require("../../../util/coercion");
7
- const signal_address_1 = require("../../../util/signal-address");
8
8
  const DEFAULTS = Object.freeze({
9
9
  preKeyBatchSize: 500,
10
10
  hasSessionBatchSize: 250
11
11
  });
12
+ function repeatSqlToken(token, count, separator) {
13
+ if (count <= 1) {
14
+ return token;
15
+ }
16
+ let out = token;
17
+ for (let index = 1; index < count; index += 1) {
18
+ out += separator + token;
19
+ }
20
+ return out;
21
+ }
12
22
  class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
13
23
  constructor(options, storeOptions = {}) {
14
24
  super(options, ['signal']);
@@ -144,7 +154,7 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
144
154
  for (let start = 0; start < uniqueKeyIds.length; start += this.preKeyBatchSize) {
145
155
  const end = Math.min(start + this.preKeyBatchSize, uniqueKeyIds.length);
146
156
  const batchLength = end - start;
147
- const placeholders = new Array(batchLength).fill('?').join(', ');
157
+ const placeholders = repeatSqlToken('?', batchLength, ', ');
148
158
  const params = [this.options.sessionId];
149
159
  for (let index = start; index < end; index += 1) {
150
160
  params.push(uniqueKeyIds[index]);
@@ -216,9 +226,7 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
216
226
  for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
217
227
  const end = Math.min(start + this.hasSessionBatchSize, targets.length);
218
228
  const batchLength = end - start;
219
- const filters = new Array(batchLength)
220
- .fill('(user = ? AND server = ? AND device = ?)')
221
- .join(' OR ');
229
+ const filters = repeatSqlToken('(user = ? AND server = ? AND device = ?)', batchLength, ' OR ');
222
230
  const params = [this.options.sessionId];
223
231
  for (let index = start; index < end; index += 1) {
224
232
  const target = targets[index];
@@ -228,14 +236,14 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
228
236
  FROM signal_session
229
237
  WHERE session_id = ? AND (${filters})`, params);
230
238
  for (const row of rows) {
231
- existingKeys.add((0, signal_address_1.signalAddressKey)({
239
+ existingKeys.add((0, jid_1.signalAddressKey)({
232
240
  user: (0, coercion_1.asString)(row.user, 'signal_session.user'),
233
241
  server: (0, coercion_1.asString)(row.server, 'signal_session.server'),
234
242
  device: (0, coercion_1.asNumber)(row.device, 'signal_session.device')
235
243
  }));
236
244
  }
237
245
  }
238
- return addresses.map((address) => existingKeys.has((0, signal_address_1.signalAddressKey)(address)));
246
+ return targets.map((target) => existingKeys.has((0, jid_1.signalAddressKey)(target)));
239
247
  }
240
248
  async getSession(address) {
241
249
  const db = await this.getConnection();
@@ -245,24 +253,50 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
245
253
  WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
246
254
  return row ? (0, sqlite_1.decodeSignalSessionRecord)(row.record) : null;
247
255
  }
256
+ async getSessionsBatch(addresses) {
257
+ if (addresses.length === 0) {
258
+ return [];
259
+ }
260
+ const db = await this.getConnection();
261
+ const targets = addresses.map((address) => (0, sqlite_1.toSignalAddressParts)(address));
262
+ const byAddressKey = new Map();
263
+ for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
264
+ const end = Math.min(start + this.hasSessionBatchSize, targets.length);
265
+ const batchLength = end - start;
266
+ const filters = repeatSqlToken('(user = ? AND server = ? AND device = ?)', batchLength, ' OR ');
267
+ const params = [this.options.sessionId];
268
+ for (let index = start; index < end; index += 1) {
269
+ const target = targets[index];
270
+ params.push(target.user, target.server, target.device);
271
+ }
272
+ const rows = db.all(`SELECT user, server, device, record
273
+ FROM signal_session
274
+ WHERE session_id = ? AND (${filters})`, params);
275
+ for (const row of rows) {
276
+ byAddressKey.set((0, jid_1.signalAddressKey)({
277
+ user: (0, coercion_1.asString)(row.user, 'signal_session.user'),
278
+ server: (0, coercion_1.asString)(row.server, 'signal_session.server'),
279
+ device: (0, coercion_1.asNumber)(row.device, 'signal_session.device')
280
+ }), (0, sqlite_1.decodeSignalSessionRecord)(row.record));
281
+ }
282
+ }
283
+ return targets.map((target) => byAddressKey.get((0, jid_1.signalAddressKey)(target)) ?? null);
284
+ }
248
285
  async setSession(address, session) {
249
286
  const db = await this.getConnection();
250
287
  const target = (0, sqlite_1.toSignalAddressParts)(address);
251
- db.run(`INSERT INTO signal_session (
252
- session_id,
253
- user,
254
- server,
255
- device,
256
- record
257
- ) VALUES (?, ?, ?, ?, ?)
258
- ON CONFLICT(session_id, user, server, device) DO UPDATE SET
259
- record=excluded.record`, [
260
- this.options.sessionId,
261
- target.user,
262
- target.server,
263
- target.device,
264
- (0, sqlite_1.encodeSignalSessionRecord)(session)
265
- ]);
288
+ this.upsertSession(db, target, session);
289
+ }
290
+ async setSessionsBatch(entries) {
291
+ if (entries.length === 0) {
292
+ return;
293
+ }
294
+ await this.withTransaction((db) => {
295
+ for (let index = 0; index < entries.length; index += 1) {
296
+ const entry = entries[index];
297
+ this.upsertSession(db, (0, sqlite_1.toSignalAddressParts)(entry.address), entry.session);
298
+ }
299
+ });
266
300
  }
267
301
  async deleteSession(address) {
268
302
  const db = await this.getConnection();
@@ -278,6 +312,35 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
278
312
  WHERE session_id = ? AND user = ? AND server = ? AND device = ?`, [this.options.sessionId, target.user, target.server, target.device]);
279
313
  return row ? (0, sqlite_1.decodeSignalRemoteIdentity)(row.identity_key) : null;
280
314
  }
315
+ async getRemoteIdentities(addresses) {
316
+ if (addresses.length === 0) {
317
+ return [];
318
+ }
319
+ const db = await this.getConnection();
320
+ const targets = addresses.map((address) => (0, sqlite_1.toSignalAddressParts)(address));
321
+ const byAddressKey = new Map();
322
+ for (let start = 0; start < targets.length; start += this.hasSessionBatchSize) {
323
+ const end = Math.min(start + this.hasSessionBatchSize, targets.length);
324
+ const batchLength = end - start;
325
+ const filters = repeatSqlToken('(user = ? AND server = ? AND device = ?)', batchLength, ' OR ');
326
+ const params = [this.options.sessionId];
327
+ for (let index = start; index < end; index += 1) {
328
+ const target = targets[index];
329
+ params.push(target.user, target.server, target.device);
330
+ }
331
+ const rows = db.all(`SELECT user, server, device, identity_key
332
+ FROM signal_identity
333
+ WHERE session_id = ? AND (${filters})`, params);
334
+ for (const row of rows) {
335
+ byAddressKey.set((0, jid_1.signalAddressKey)({
336
+ user: (0, coercion_1.asString)(row.user, 'signal_identity.user'),
337
+ server: (0, coercion_1.asString)(row.server, 'signal_identity.server'),
338
+ device: (0, coercion_1.asNumber)(row.device, 'signal_identity.device')
339
+ }), (0, sqlite_1.decodeSignalRemoteIdentity)(row.identity_key));
340
+ }
341
+ }
342
+ return targets.map((target) => byAddressKey.get((0, jid_1.signalAddressKey)(target)) ?? null);
343
+ }
281
344
  async setRemoteIdentity(address, identityKey) {
282
345
  const db = await this.getConnection();
283
346
  const target = (0, sqlite_1.toSignalAddressParts)(address);
@@ -297,7 +360,9 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
297
360
  async clear() {
298
361
  await this.withTransaction((db) => {
299
362
  db.run('DELETE FROM signal_registration WHERE session_id = ?', [this.options.sessionId]);
300
- db.run('DELETE FROM signal_signed_prekey WHERE session_id = ?', [this.options.sessionId]);
363
+ db.run('DELETE FROM signal_signed_prekey WHERE session_id = ?', [
364
+ this.options.sessionId
365
+ ]);
301
366
  db.run('DELETE FROM signal_prekey WHERE session_id = ?', [this.options.sessionId]);
302
367
  db.run('DELETE FROM signal_session WHERE session_id = ?', [this.options.sessionId]);
303
368
  db.run('DELETE FROM signal_identity WHERE session_id = ?', [this.options.sessionId]);
@@ -323,6 +388,23 @@ class WaSignalSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
323
388
  record.uploaded === true ? 1 : 0
324
389
  ]);
325
390
  }
391
+ upsertSession(db, target, session) {
392
+ db.run(`INSERT INTO signal_session (
393
+ session_id,
394
+ user,
395
+ server,
396
+ device,
397
+ record
398
+ ) VALUES (?, ?, ?, ?, ?)
399
+ ON CONFLICT(session_id, user, server, device) DO UPDATE SET
400
+ record=excluded.record`, [
401
+ this.options.sessionId,
402
+ target.user,
403
+ target.server,
404
+ target.device,
405
+ (0, sqlite_1.encodeSignalSessionRecord)(session)
406
+ ]);
407
+ }
326
408
  ensureMetaRow(db) {
327
409
  db.run(`INSERT INTO signal_meta (
328
410
  session_id,
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WA_SQLITE_DEFAULT_TABLE_NAMES = void 0;
4
+ exports.resolveSqliteTableNames = resolveSqliteTableNames;
5
+ exports.serializeSqliteTableNames = serializeSqliteTableNames;
6
+ exports.createSqliteTableNameSqlResolver = createSqliteTableNameSqlResolver;
7
+ const SQLITE_TABLE_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
8
+ const WA_SQLITE_TABLE_NAME_ORDER = Object.freeze([
9
+ 'wa_migrations',
10
+ 'auth_credentials',
11
+ 'signal_meta',
12
+ 'signal_registration',
13
+ 'signal_signed_prekey',
14
+ 'signal_prekey',
15
+ 'signal_session',
16
+ 'signal_identity',
17
+ 'sender_keys',
18
+ 'sender_key_distribution',
19
+ 'appstate_sync_keys',
20
+ 'appstate_collection_versions',
21
+ 'appstate_collection_index_values',
22
+ 'retry_outbound_messages',
23
+ 'retry_inbound_counters',
24
+ 'mailbox_messages',
25
+ 'mailbox_threads',
26
+ 'mailbox_contacts',
27
+ 'group_participants_cache',
28
+ 'device_list_cache'
29
+ ]);
30
+ const WA_SQLITE_ALLOWED_TABLE_NAME_SET = new Set(WA_SQLITE_TABLE_NAME_ORDER);
31
+ const WA_SQLITE_ALLOWED_TABLE_NAME_LIST = WA_SQLITE_TABLE_NAME_ORDER.join(', ');
32
+ exports.WA_SQLITE_DEFAULT_TABLE_NAMES = Object.freeze({
33
+ wa_migrations: 'wa_migrations',
34
+ auth_credentials: 'auth_credentials',
35
+ signal_meta: 'signal_meta',
36
+ signal_registration: 'signal_registration',
37
+ signal_signed_prekey: 'signal_signed_prekey',
38
+ signal_prekey: 'signal_prekey',
39
+ signal_session: 'signal_session',
40
+ signal_identity: 'signal_identity',
41
+ sender_keys: 'sender_keys',
42
+ sender_key_distribution: 'sender_key_distribution',
43
+ appstate_sync_keys: 'appstate_sync_keys',
44
+ appstate_collection_versions: 'appstate_collection_versions',
45
+ appstate_collection_index_values: 'appstate_collection_index_values',
46
+ retry_outbound_messages: 'retry_outbound_messages',
47
+ retry_inbound_counters: 'retry_inbound_counters',
48
+ mailbox_messages: 'mailbox_messages',
49
+ mailbox_threads: 'mailbox_threads',
50
+ mailbox_contacts: 'mailbox_contacts',
51
+ group_participants_cache: 'group_participants_cache',
52
+ device_list_cache: 'device_list_cache'
53
+ });
54
+ const DEFAULT_SQLITE_TABLE_NAME_SERIALIZATION = serializeSqliteTableNames(exports.WA_SQLITE_DEFAULT_TABLE_NAMES);
55
+ function normalizeTableName(table, rawValue) {
56
+ const value = rawValue.trim();
57
+ if (value.length === 0) {
58
+ throw new Error(`sqlite tableNames.${table} must be a non-empty string`);
59
+ }
60
+ if (!SQLITE_TABLE_NAME_PATTERN.test(value)) {
61
+ throw new Error(`sqlite tableNames.${table} must match ${SQLITE_TABLE_NAME_PATTERN.toString()}`);
62
+ }
63
+ return value;
64
+ }
65
+ function assertNoDuplicateTableNames(tableNames) {
66
+ const seen = new Set();
67
+ for (const table of WA_SQLITE_TABLE_NAME_ORDER) {
68
+ const mapped = tableNames[table];
69
+ const normalizedMapped = mapped.toLowerCase();
70
+ if (seen.has(normalizedMapped)) {
71
+ throw new Error(`sqlite tableNames contains duplicate target "${mapped}"`);
72
+ }
73
+ seen.add(normalizedMapped);
74
+ }
75
+ }
76
+ function resolveSqliteTableNames(overrides) {
77
+ if (!overrides) {
78
+ return exports.WA_SQLITE_DEFAULT_TABLE_NAMES;
79
+ }
80
+ const entries = Object.entries(overrides);
81
+ if (entries.length === 0) {
82
+ return exports.WA_SQLITE_DEFAULT_TABLE_NAMES;
83
+ }
84
+ const resolved = {
85
+ ...exports.WA_SQLITE_DEFAULT_TABLE_NAMES
86
+ };
87
+ for (const [table, rawName] of entries) {
88
+ if (!WA_SQLITE_ALLOWED_TABLE_NAME_SET.has(table)) {
89
+ throw new Error(`unsupported sqlite tableNames key "${table}". Allowed table names: ${WA_SQLITE_ALLOWED_TABLE_NAME_LIST}`);
90
+ }
91
+ if (typeof rawName !== 'string') {
92
+ throw new Error(`sqlite tableNames.${table} must be a string`);
93
+ }
94
+ const tableName = table;
95
+ resolved[tableName] = normalizeTableName(tableName, rawName);
96
+ }
97
+ assertNoDuplicateTableNames(resolved);
98
+ return Object.freeze(resolved);
99
+ }
100
+ function serializeSqliteTableNames(tableNames) {
101
+ return WA_SQLITE_TABLE_NAME_ORDER.map((table) => `${table}=${tableNames[table]}`).join(';');
102
+ }
103
+ function escapeRegexToken(value) {
104
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
105
+ }
106
+ function createSqliteTableNameSqlResolver(tableNames) {
107
+ const serialized = serializeSqliteTableNames(tableNames);
108
+ if (serialized === DEFAULT_SQLITE_TABLE_NAME_SERIALIZATION) {
109
+ return (sql) => sql;
110
+ }
111
+ const pattern = new RegExp(`\\b(?:${WA_SQLITE_TABLE_NAME_ORDER.map(escapeRegexToken).join('|')})\\b`, 'g');
112
+ return (sql) => sql.replace(pattern, (token) => tableNames[token] ?? token);
113
+ }
@@ -23,28 +23,17 @@ class WaThreadSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
23
23
  }
24
24
  async upsert(record) {
25
25
  const db = await this.getConnection();
26
- db.run(`INSERT INTO mailbox_threads (
27
- session_id, jid, name, unread_count, archived, pinned,
28
- mute_end_ms, marked_as_unread, ephemeral_expiration
29
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
30
- ON CONFLICT(session_id, jid) DO UPDATE SET
31
- name=COALESCE(excluded.name, mailbox_threads.name),
32
- unread_count=COALESCE(excluded.unread_count, mailbox_threads.unread_count),
33
- archived=COALESCE(excluded.archived, mailbox_threads.archived),
34
- pinned=COALESCE(excluded.pinned, mailbox_threads.pinned),
35
- mute_end_ms=COALESCE(excluded.mute_end_ms, mailbox_threads.mute_end_ms),
36
- marked_as_unread=COALESCE(excluded.marked_as_unread, mailbox_threads.marked_as_unread),
37
- ephemeral_expiration=COALESCE(excluded.ephemeral_expiration, mailbox_threads.ephemeral_expiration)`, [
38
- this.options.sessionId,
39
- record.jid,
40
- record.name ?? null,
41
- record.unreadCount ?? null,
42
- record.archived === undefined ? null : record.archived ? 1 : 0,
43
- record.pinned ?? null,
44
- record.muteEndMs ?? null,
45
- record.markedAsUnread === undefined ? null : record.markedAsUnread ? 1 : 0,
46
- record.ephemeralExpiration ?? null
47
- ]);
26
+ this.upsertThreadRow(db, record);
27
+ }
28
+ async upsertBatch(records) {
29
+ if (records.length === 0) {
30
+ return;
31
+ }
32
+ await this.withTransaction((db) => {
33
+ for (const record of records) {
34
+ this.upsertThreadRow(db, record);
35
+ }
36
+ });
48
37
  }
49
38
  async getByJid(jid) {
50
39
  const db = await this.getConnection();
@@ -72,5 +61,29 @@ class WaThreadSqliteStore extends BaseSqliteStore_1.BaseSqliteStore {
72
61
  const db = await this.getConnection();
73
62
  db.run('DELETE FROM mailbox_threads WHERE session_id = ?', [this.options.sessionId]);
74
63
  }
64
+ upsertThreadRow(db, record) {
65
+ db.run(`INSERT INTO mailbox_threads (
66
+ session_id, jid, name, unread_count, archived, pinned,
67
+ mute_end_ms, marked_as_unread, ephemeral_expiration
68
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
69
+ ON CONFLICT(session_id, jid) DO UPDATE SET
70
+ name=COALESCE(excluded.name, mailbox_threads.name),
71
+ unread_count=COALESCE(excluded.unread_count, mailbox_threads.unread_count),
72
+ archived=COALESCE(excluded.archived, mailbox_threads.archived),
73
+ pinned=COALESCE(excluded.pinned, mailbox_threads.pinned),
74
+ mute_end_ms=COALESCE(excluded.mute_end_ms, mailbox_threads.mute_end_ms),
75
+ marked_as_unread=COALESCE(excluded.marked_as_unread, mailbox_threads.marked_as_unread),
76
+ ephemeral_expiration=COALESCE(excluded.ephemeral_expiration, mailbox_threads.ephemeral_expiration)`, [
77
+ this.options.sessionId,
78
+ record.jid,
79
+ record.name ?? null,
80
+ record.unreadCount ?? null,
81
+ record.archived === undefined ? null : record.archived ? 1 : 0,
82
+ record.pinned ?? null,
83
+ record.muteEndMs ?? null,
84
+ record.markedAsUnread === undefined ? null : record.markedAsUnread ? 1 : 0,
85
+ record.ephemeralExpiration ?? null
86
+ ]);
87
+ }
75
88
  }
76
89
  exports.WaThreadSqliteStore = WaThreadSqliteStore;
@@ -6,8 +6,8 @@ const BoundedTaskQueue_1 = require("../infra/perf/BoundedTaskQueue");
6
6
  const constants_1 = require("../protocol/constants");
7
7
  const WaNoiseSession_1 = require("./noise/WaNoiseSession");
8
8
  const WaWebSocket_1 = require("./WaWebSocket");
9
- const base64_1 = require("../util/base64");
10
9
  const bytes_1 = require("../util/bytes");
10
+ const bytes_2 = require("../util/bytes");
11
11
  const primitives_1 = require("../util/primitives");
12
12
  const WA_FRAME_HANDLER_QUEUE_MAX_SIZE = 4096;
13
13
  const WA_FRAME_HANDLER_MAX_CONCURRENCY = 8;
@@ -30,6 +30,8 @@ class WaComms {
30
30
  url: this.config.url,
31
31
  urls: this.config.urls,
32
32
  protocols: this.config.protocols,
33
+ dispatcher: this.config.dispatcher,
34
+ agent: this.config.agent,
33
35
  timeoutIntervalMs: this.config.timeoutIntervalMs
34
36
  }, logger);
35
37
  this.socket.setHandlers({
@@ -80,7 +82,7 @@ class WaComms {
80
82
  if (!routingInfo || routingInfo.byteLength === 0) {
81
83
  return config;
82
84
  }
83
- const edValue = (0, base64_1.bytesToBase64UrlSafe)(routingInfo);
85
+ const edValue = (0, bytes_1.bytesToBase64UrlSafe)(routingInfo);
84
86
  const appendEd = (url) => {
85
87
  try {
86
88
  const parsed = new URL(url);
@@ -147,9 +149,7 @@ class WaComms {
147
149
  startHandlingRequests() {
148
150
  this.handlingRequests = true;
149
151
  this.logger.debug('comms request handling enabled');
150
- this.frameProcessingQueue = this.frameProcessingQueue
151
- .catch(() => undefined)
152
- .then(async () => this.flushPendingFrames());
152
+ this.frameProcessingQueue = this.frameProcessingQueue.then(() => this.flushPendingFrames(), () => this.flushPendingFrames());
153
153
  }
154
154
  async stopComms() {
155
155
  this.logger.info('comms stop requested');
@@ -275,9 +275,7 @@ class WaComms {
275
275
  });
276
276
  }
277
277
  onSocketMessage(payload) {
278
- this.frameProcessingQueue = this.frameProcessingQueue
279
- .catch(() => undefined)
280
- .then(async () => this.processSocketPayload(payload));
278
+ this.frameProcessingQueue = this.frameProcessingQueue.then(() => this.processSocketPayload(payload), () => this.processSocketPayload(payload));
281
279
  }
282
280
  async processSocketPayload(payload) {
283
281
  if (!this.noiseSession) {
@@ -342,7 +340,7 @@ class WaComms {
342
340
  this.noiseSession = null;
343
341
  throw error;
344
342
  }
345
- const buffered = await session.pushWireChunk(bytes_1.EMPTY_BYTES);
343
+ const buffered = await session.pushWireChunk(bytes_2.EMPTY_BYTES);
346
344
  this.routeDecodedFrames(buffered);
347
345
  this.resumeHandshakeFailures = 0;
348
346
  this.lastServerStaticKey = session.getServerStaticKey();
@@ -426,20 +424,19 @@ class WaComms {
426
424
  }
427
425
  scheduleDecodedFrame(frame) {
428
426
  void this.frameHandlerQueue
429
- .enqueue(async () => this.onDecodedFrame(frame))
427
+ .enqueue(() => this.onDecodedFrame(frame))
430
428
  .catch((error) => {
431
- const normalized = (0, primitives_1.toError)(error);
432
- this.logger.error('failed to enqueue decoded frame handler', {
433
- message: normalized.message
434
- });
435
- if (!(error instanceof BoundedTaskQueue_1.BoundedTaskQueueFullError)) {
429
+ if (error instanceof BoundedTaskQueue_1.BoundedTaskQueueFullError) {
430
+ this.logger.warn('frame handler queue is full, resuming socket to preserve bounds', {
431
+ pending: this.frameHandlerQueue.pending(),
432
+ inFlight: this.frameHandlerQueue.inFlight()
433
+ });
434
+ void this.closeSocketAndResume();
436
435
  return;
437
436
  }
438
- this.logger.warn('frame handler queue is full, processing frame inline', {
439
- pending: this.frameHandlerQueue.pending(),
440
- inFlight: this.frameHandlerQueue.inFlight()
437
+ this.logger.error('failed to enqueue decoded frame handler', {
438
+ message: (0, primitives_1.toError)(error).message
441
439
  });
442
- void this.onDecodedFrame(frame);
443
440
  });
444
441
  }
445
442
  scheduleReconnect() {
@@ -463,12 +460,16 @@ class WaComms {
463
460
  this.reconnectTimer = null;
464
461
  }
465
462
  removeWaiter(reject) {
466
- const index = this.waiters.findIndex((entry) => entry.reject === reject);
467
- if (index === -1) {
463
+ for (let index = 0; index < this.waiters.length; index += 1) {
464
+ const waiter = this.waiters[index];
465
+ if (waiter.reject !== reject) {
466
+ continue;
467
+ }
468
+ clearTimeout(waiter.timer);
469
+ this.waiters[index] = this.waiters[this.waiters.length - 1];
470
+ this.waiters.pop();
468
471
  return;
469
472
  }
470
- const [waiter] = this.waiters.splice(index, 1);
471
- clearTimeout(waiter.timer);
472
473
  }
473
474
  withStickyRoutingCookie(headers) {
474
475
  const out = headers ? { ...headers } : {};
@@ -521,11 +522,12 @@ class WaComms {
521
522
  }
522
523
  }
523
524
  drainWaiters(drain) {
524
- const waiters = this.waiters.splice(0, this.waiters.length);
525
- for (const waiter of waiters) {
525
+ for (let index = this.waiters.length - 1; index >= 0; index -= 1) {
526
+ const waiter = this.waiters[index];
526
527
  clearTimeout(waiter.timer);
527
528
  drain(waiter);
528
529
  }
530
+ this.waiters.length = 0;
529
531
  }
530
532
  }
531
533
  exports.WaComms = WaComms;