@powersync/service-core 0.0.0-dev-20240620165206

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 (454) hide show
  1. package/.probes/.gitkeep +0 -0
  2. package/CHANGELOG.md +82 -0
  3. package/LICENSE +67 -0
  4. package/README.md +3 -0
  5. package/dist/api/api-index.d.ts +2 -0
  6. package/dist/api/api-index.js +3 -0
  7. package/dist/api/api-index.js.map +1 -0
  8. package/dist/api/diagnostics.d.ts +21 -0
  9. package/dist/api/diagnostics.js +183 -0
  10. package/dist/api/diagnostics.js.map +1 -0
  11. package/dist/api/schema.d.ts +5 -0
  12. package/dist/api/schema.js +88 -0
  13. package/dist/api/schema.js.map +1 -0
  14. package/dist/auth/CachedKeyCollector.d.ts +46 -0
  15. package/dist/auth/CachedKeyCollector.js +116 -0
  16. package/dist/auth/CachedKeyCollector.js.map +1 -0
  17. package/dist/auth/CompoundKeyCollector.d.ts +8 -0
  18. package/dist/auth/CompoundKeyCollector.js +23 -0
  19. package/dist/auth/CompoundKeyCollector.js.map +1 -0
  20. package/dist/auth/JwtPayload.d.ts +10 -0
  21. package/dist/auth/JwtPayload.js +2 -0
  22. package/dist/auth/JwtPayload.js.map +1 -0
  23. package/dist/auth/KeyCollector.d.ts +24 -0
  24. package/dist/auth/KeyCollector.js +2 -0
  25. package/dist/auth/KeyCollector.js.map +1 -0
  26. package/dist/auth/KeySpec.d.ts +26 -0
  27. package/dist/auth/KeySpec.js +49 -0
  28. package/dist/auth/KeySpec.js.map +1 -0
  29. package/dist/auth/KeyStore.d.ts +39 -0
  30. package/dist/auth/KeyStore.js +131 -0
  31. package/dist/auth/KeyStore.js.map +1 -0
  32. package/dist/auth/LeakyBucket.d.ts +39 -0
  33. package/dist/auth/LeakyBucket.js +57 -0
  34. package/dist/auth/LeakyBucket.js.map +1 -0
  35. package/dist/auth/RemoteJWKSCollector.d.ts +24 -0
  36. package/dist/auth/RemoteJWKSCollector.js +106 -0
  37. package/dist/auth/RemoteJWKSCollector.js.map +1 -0
  38. package/dist/auth/StaticKeyCollector.d.ts +14 -0
  39. package/dist/auth/StaticKeyCollector.js +19 -0
  40. package/dist/auth/StaticKeyCollector.js.map +1 -0
  41. package/dist/auth/SupabaseKeyCollector.d.ts +22 -0
  42. package/dist/auth/SupabaseKeyCollector.js +61 -0
  43. package/dist/auth/SupabaseKeyCollector.js.map +1 -0
  44. package/dist/auth/auth-index.d.ts +10 -0
  45. package/dist/auth/auth-index.js +11 -0
  46. package/dist/auth/auth-index.js.map +1 -0
  47. package/dist/db/db-index.d.ts +1 -0
  48. package/dist/db/db-index.js +2 -0
  49. package/dist/db/db-index.js.map +1 -0
  50. package/dist/db/mongo.d.ts +29 -0
  51. package/dist/db/mongo.js +65 -0
  52. package/dist/db/mongo.js.map +1 -0
  53. package/dist/entry/cli-entry.d.ts +15 -0
  54. package/dist/entry/cli-entry.js +36 -0
  55. package/dist/entry/cli-entry.js.map +1 -0
  56. package/dist/entry/commands/config-command.d.ts +10 -0
  57. package/dist/entry/commands/config-command.js +21 -0
  58. package/dist/entry/commands/config-command.js.map +1 -0
  59. package/dist/entry/commands/migrate-action.d.ts +2 -0
  60. package/dist/entry/commands/migrate-action.js +18 -0
  61. package/dist/entry/commands/migrate-action.js.map +1 -0
  62. package/dist/entry/commands/start-action.d.ts +3 -0
  63. package/dist/entry/commands/start-action.js +15 -0
  64. package/dist/entry/commands/start-action.js.map +1 -0
  65. package/dist/entry/commands/teardown-action.d.ts +2 -0
  66. package/dist/entry/commands/teardown-action.js +17 -0
  67. package/dist/entry/commands/teardown-action.js.map +1 -0
  68. package/dist/entry/entry-index.d.ts +5 -0
  69. package/dist/entry/entry-index.js +6 -0
  70. package/dist/entry/entry-index.js.map +1 -0
  71. package/dist/index.d.ts +25 -0
  72. package/dist/index.js +28 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/locks/LockManager.d.ts +10 -0
  75. package/dist/locks/LockManager.js +7 -0
  76. package/dist/locks/LockManager.js.map +1 -0
  77. package/dist/locks/MongoLocks.d.ts +36 -0
  78. package/dist/locks/MongoLocks.js +81 -0
  79. package/dist/locks/MongoLocks.js.map +1 -0
  80. package/dist/locks/locks-index.d.ts +2 -0
  81. package/dist/locks/locks-index.js +3 -0
  82. package/dist/locks/locks-index.js.map +1 -0
  83. package/dist/metrics/Metrics.d.ts +30 -0
  84. package/dist/metrics/Metrics.js +176 -0
  85. package/dist/metrics/Metrics.js.map +1 -0
  86. package/dist/migrations/db/migrations/1684951997326-init.d.ts +3 -0
  87. package/dist/migrations/db/migrations/1684951997326-init.js +31 -0
  88. package/dist/migrations/db/migrations/1684951997326-init.js.map +1 -0
  89. package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.d.ts +2 -0
  90. package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js +5 -0
  91. package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js.map +1 -0
  92. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.d.ts +3 -0
  93. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js +54 -0
  94. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -0
  95. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.d.ts +3 -0
  96. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js +27 -0
  97. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js.map +1 -0
  98. package/dist/migrations/definitions.d.ts +18 -0
  99. package/dist/migrations/definitions.js +6 -0
  100. package/dist/migrations/definitions.js.map +1 -0
  101. package/dist/migrations/executor.d.ts +16 -0
  102. package/dist/migrations/executor.js +64 -0
  103. package/dist/migrations/executor.js.map +1 -0
  104. package/dist/migrations/migrations-index.d.ts +3 -0
  105. package/dist/migrations/migrations-index.js +4 -0
  106. package/dist/migrations/migrations-index.js.map +1 -0
  107. package/dist/migrations/migrations.d.ts +10 -0
  108. package/dist/migrations/migrations.js +90 -0
  109. package/dist/migrations/migrations.js.map +1 -0
  110. package/dist/migrations/store/migration-store.d.ts +11 -0
  111. package/dist/migrations/store/migration-store.js +46 -0
  112. package/dist/migrations/store/migration-store.js.map +1 -0
  113. package/dist/replication/ErrorRateLimiter.d.ts +17 -0
  114. package/dist/replication/ErrorRateLimiter.js +43 -0
  115. package/dist/replication/ErrorRateLimiter.js.map +1 -0
  116. package/dist/replication/PgRelation.d.ts +16 -0
  117. package/dist/replication/PgRelation.js +26 -0
  118. package/dist/replication/PgRelation.js.map +1 -0
  119. package/dist/replication/WalConnection.d.ts +34 -0
  120. package/dist/replication/WalConnection.js +190 -0
  121. package/dist/replication/WalConnection.js.map +1 -0
  122. package/dist/replication/WalStream.d.ts +57 -0
  123. package/dist/replication/WalStream.js +515 -0
  124. package/dist/replication/WalStream.js.map +1 -0
  125. package/dist/replication/WalStreamManager.d.ts +30 -0
  126. package/dist/replication/WalStreamManager.js +198 -0
  127. package/dist/replication/WalStreamManager.js.map +1 -0
  128. package/dist/replication/WalStreamRunner.d.ts +38 -0
  129. package/dist/replication/WalStreamRunner.js +155 -0
  130. package/dist/replication/WalStreamRunner.js.map +1 -0
  131. package/dist/replication/replication-index.d.ts +7 -0
  132. package/dist/replication/replication-index.js +8 -0
  133. package/dist/replication/replication-index.js.map +1 -0
  134. package/dist/replication/util.d.ts +9 -0
  135. package/dist/replication/util.js +62 -0
  136. package/dist/replication/util.js.map +1 -0
  137. package/dist/routes/auth.d.ts +56 -0
  138. package/dist/routes/auth.js +182 -0
  139. package/dist/routes/auth.js.map +1 -0
  140. package/dist/routes/endpoints/admin.d.ts +1011 -0
  141. package/dist/routes/endpoints/admin.js +207 -0
  142. package/dist/routes/endpoints/admin.js.map +1 -0
  143. package/dist/routes/endpoints/checkpointing.d.ts +76 -0
  144. package/dist/routes/endpoints/checkpointing.js +36 -0
  145. package/dist/routes/endpoints/checkpointing.js.map +1 -0
  146. package/dist/routes/endpoints/dev.d.ts +312 -0
  147. package/dist/routes/endpoints/dev.js +172 -0
  148. package/dist/routes/endpoints/dev.js.map +1 -0
  149. package/dist/routes/endpoints/route-endpoints-index.d.ts +6 -0
  150. package/dist/routes/endpoints/route-endpoints-index.js +7 -0
  151. package/dist/routes/endpoints/route-endpoints-index.js.map +1 -0
  152. package/dist/routes/endpoints/socket-route.d.ts +2 -0
  153. package/dist/routes/endpoints/socket-route.js +119 -0
  154. package/dist/routes/endpoints/socket-route.js.map +1 -0
  155. package/dist/routes/endpoints/sync-rules.d.ts +174 -0
  156. package/dist/routes/endpoints/sync-rules.js +202 -0
  157. package/dist/routes/endpoints/sync-rules.js.map +1 -0
  158. package/dist/routes/endpoints/sync-stream.d.ts +132 -0
  159. package/dist/routes/endpoints/sync-stream.js +83 -0
  160. package/dist/routes/endpoints/sync-stream.js.map +1 -0
  161. package/dist/routes/hooks.d.ts +10 -0
  162. package/dist/routes/hooks.js +32 -0
  163. package/dist/routes/hooks.js.map +1 -0
  164. package/dist/routes/route-register.d.ts +10 -0
  165. package/dist/routes/route-register.js +87 -0
  166. package/dist/routes/route-register.js.map +1 -0
  167. package/dist/routes/router-socket.d.ts +10 -0
  168. package/dist/routes/router-socket.js +5 -0
  169. package/dist/routes/router-socket.js.map +1 -0
  170. package/dist/routes/router.d.ts +26 -0
  171. package/dist/routes/router.js +7 -0
  172. package/dist/routes/router.js.map +1 -0
  173. package/dist/routes/routes-index.d.ts +6 -0
  174. package/dist/routes/routes-index.js +7 -0
  175. package/dist/routes/routes-index.js.map +1 -0
  176. package/dist/runner/teardown.d.ts +2 -0
  177. package/dist/runner/teardown.js +94 -0
  178. package/dist/runner/teardown.js.map +1 -0
  179. package/dist/storage/BucketStorage.d.ts +307 -0
  180. package/dist/storage/BucketStorage.js +25 -0
  181. package/dist/storage/BucketStorage.js.map +1 -0
  182. package/dist/storage/ChecksumCache.d.ts +50 -0
  183. package/dist/storage/ChecksumCache.js +234 -0
  184. package/dist/storage/ChecksumCache.js.map +1 -0
  185. package/dist/storage/MongoBucketStorage.d.ts +52 -0
  186. package/dist/storage/MongoBucketStorage.js +409 -0
  187. package/dist/storage/MongoBucketStorage.js.map +1 -0
  188. package/dist/storage/SourceTable.d.ts +39 -0
  189. package/dist/storage/SourceTable.js +50 -0
  190. package/dist/storage/SourceTable.js.map +1 -0
  191. package/dist/storage/mongo/MongoBucketBatch.d.ts +48 -0
  192. package/dist/storage/mongo/MongoBucketBatch.js +581 -0
  193. package/dist/storage/mongo/MongoBucketBatch.js.map +1 -0
  194. package/dist/storage/mongo/MongoIdSequence.d.ts +12 -0
  195. package/dist/storage/mongo/MongoIdSequence.js +21 -0
  196. package/dist/storage/mongo/MongoIdSequence.js.map +1 -0
  197. package/dist/storage/mongo/MongoPersistedSyncRules.d.ts +9 -0
  198. package/dist/storage/mongo/MongoPersistedSyncRules.js +9 -0
  199. package/dist/storage/mongo/MongoPersistedSyncRules.js.map +1 -0
  200. package/dist/storage/mongo/MongoPersistedSyncRulesContent.d.ts +20 -0
  201. package/dist/storage/mongo/MongoPersistedSyncRulesContent.js +26 -0
  202. package/dist/storage/mongo/MongoPersistedSyncRulesContent.js.map +1 -0
  203. package/dist/storage/mongo/MongoSyncBucketStorage.d.ts +29 -0
  204. package/dist/storage/mongo/MongoSyncBucketStorage.js +391 -0
  205. package/dist/storage/mongo/MongoSyncBucketStorage.js.map +1 -0
  206. package/dist/storage/mongo/MongoSyncRulesLock.d.ts +16 -0
  207. package/dist/storage/mongo/MongoSyncRulesLock.js +65 -0
  208. package/dist/storage/mongo/MongoSyncRulesLock.js.map +1 -0
  209. package/dist/storage/mongo/OperationBatch.d.ts +26 -0
  210. package/dist/storage/mongo/OperationBatch.js +101 -0
  211. package/dist/storage/mongo/OperationBatch.js.map +1 -0
  212. package/dist/storage/mongo/PersistedBatch.d.ts +46 -0
  213. package/dist/storage/mongo/PersistedBatch.js +213 -0
  214. package/dist/storage/mongo/PersistedBatch.js.map +1 -0
  215. package/dist/storage/mongo/db.d.ts +26 -0
  216. package/dist/storage/mongo/db.js +35 -0
  217. package/dist/storage/mongo/db.js.map +1 -0
  218. package/dist/storage/mongo/models.d.ts +140 -0
  219. package/dist/storage/mongo/models.js +27 -0
  220. package/dist/storage/mongo/models.js.map +1 -0
  221. package/dist/storage/mongo/util.d.ts +26 -0
  222. package/dist/storage/mongo/util.js +81 -0
  223. package/dist/storage/mongo/util.js.map +1 -0
  224. package/dist/storage/storage-index.d.ts +14 -0
  225. package/dist/storage/storage-index.js +15 -0
  226. package/dist/storage/storage-index.js.map +1 -0
  227. package/dist/sync/BroadcastIterable.d.ts +38 -0
  228. package/dist/sync/BroadcastIterable.js +153 -0
  229. package/dist/sync/BroadcastIterable.js.map +1 -0
  230. package/dist/sync/LastValueSink.d.ts +25 -0
  231. package/dist/sync/LastValueSink.js +84 -0
  232. package/dist/sync/LastValueSink.js.map +1 -0
  233. package/dist/sync/merge.d.ts +39 -0
  234. package/dist/sync/merge.js +175 -0
  235. package/dist/sync/merge.js.map +1 -0
  236. package/dist/sync/safeRace.d.ts +1 -0
  237. package/dist/sync/safeRace.js +91 -0
  238. package/dist/sync/safeRace.js.map +1 -0
  239. package/dist/sync/sync-index.d.ts +6 -0
  240. package/dist/sync/sync-index.js +7 -0
  241. package/dist/sync/sync-index.js.map +1 -0
  242. package/dist/sync/sync.d.ts +18 -0
  243. package/dist/sync/sync.js +259 -0
  244. package/dist/sync/sync.js.map +1 -0
  245. package/dist/sync/util.d.ts +26 -0
  246. package/dist/sync/util.js +73 -0
  247. package/dist/sync/util.js.map +1 -0
  248. package/dist/system/CorePowerSyncSystem.d.ts +23 -0
  249. package/dist/system/CorePowerSyncSystem.js +52 -0
  250. package/dist/system/CorePowerSyncSystem.js.map +1 -0
  251. package/dist/system/system-index.d.ts +1 -0
  252. package/dist/system/system-index.js +2 -0
  253. package/dist/system/system-index.js.map +1 -0
  254. package/dist/util/Mutex.d.ts +47 -0
  255. package/dist/util/Mutex.js +132 -0
  256. package/dist/util/Mutex.js.map +1 -0
  257. package/dist/util/PgManager.d.ts +24 -0
  258. package/dist/util/PgManager.js +55 -0
  259. package/dist/util/PgManager.js.map +1 -0
  260. package/dist/util/alerting.d.ts +2 -0
  261. package/dist/util/alerting.js +8 -0
  262. package/dist/util/alerting.js.map +1 -0
  263. package/dist/util/config/collectors/config-collector.d.ts +29 -0
  264. package/dist/util/config/collectors/config-collector.js +116 -0
  265. package/dist/util/config/collectors/config-collector.js.map +1 -0
  266. package/dist/util/config/collectors/impl/base64-config-collector.d.ts +6 -0
  267. package/dist/util/config/collectors/impl/base64-config-collector.js +15 -0
  268. package/dist/util/config/collectors/impl/base64-config-collector.js.map +1 -0
  269. package/dist/util/config/collectors/impl/fallback-config-collector.d.ts +11 -0
  270. package/dist/util/config/collectors/impl/fallback-config-collector.js +19 -0
  271. package/dist/util/config/collectors/impl/fallback-config-collector.js.map +1 -0
  272. package/dist/util/config/collectors/impl/filesystem-config-collector.d.ts +6 -0
  273. package/dist/util/config/collectors/impl/filesystem-config-collector.js +37 -0
  274. package/dist/util/config/collectors/impl/filesystem-config-collector.js.map +1 -0
  275. package/dist/util/config/compound-config-collector.d.ts +32 -0
  276. package/dist/util/config/compound-config-collector.js +130 -0
  277. package/dist/util/config/compound-config-collector.js.map +1 -0
  278. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.d.ts +7 -0
  279. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js +17 -0
  280. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -0
  281. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.d.ts +7 -0
  282. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js +21 -0
  283. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -0
  284. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.d.ts +7 -0
  285. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js +17 -0
  286. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js.map +1 -0
  287. package/dist/util/config/sync-rules/sync-collector.d.ts +6 -0
  288. package/dist/util/config/sync-rules/sync-collector.js +3 -0
  289. package/dist/util/config/sync-rules/sync-collector.js.map +1 -0
  290. package/dist/util/config/types.d.ts +57 -0
  291. package/dist/util/config/types.js +7 -0
  292. package/dist/util/config/types.js.map +1 -0
  293. package/dist/util/config.d.ts +7 -0
  294. package/dist/util/config.js +35 -0
  295. package/dist/util/config.js.map +1 -0
  296. package/dist/util/env.d.ts +9 -0
  297. package/dist/util/env.js +26 -0
  298. package/dist/util/env.js.map +1 -0
  299. package/dist/util/memory-tracking.d.ts +7 -0
  300. package/dist/util/memory-tracking.js +58 -0
  301. package/dist/util/memory-tracking.js.map +1 -0
  302. package/dist/util/migration_lib.d.ts +11 -0
  303. package/dist/util/migration_lib.js +64 -0
  304. package/dist/util/migration_lib.js.map +1 -0
  305. package/dist/util/pgwire_utils.d.ts +24 -0
  306. package/dist/util/pgwire_utils.js +117 -0
  307. package/dist/util/pgwire_utils.js.map +1 -0
  308. package/dist/util/populate_test_data.d.ts +8 -0
  309. package/dist/util/populate_test_data.js +65 -0
  310. package/dist/util/populate_test_data.js.map +1 -0
  311. package/dist/util/protocol-types.d.ts +182 -0
  312. package/dist/util/protocol-types.js +42 -0
  313. package/dist/util/protocol-types.js.map +1 -0
  314. package/dist/util/secs.d.ts +2 -0
  315. package/dist/util/secs.js +49 -0
  316. package/dist/util/secs.js.map +1 -0
  317. package/dist/util/util-index.d.ts +22 -0
  318. package/dist/util/util-index.js +23 -0
  319. package/dist/util/util-index.js.map +1 -0
  320. package/dist/util/utils.d.ts +17 -0
  321. package/dist/util/utils.js +92 -0
  322. package/dist/util/utils.js.map +1 -0
  323. package/package.json +59 -0
  324. package/src/api/api-index.ts +2 -0
  325. package/src/api/diagnostics.ts +221 -0
  326. package/src/api/schema.ts +99 -0
  327. package/src/auth/CachedKeyCollector.ts +132 -0
  328. package/src/auth/CompoundKeyCollector.ts +33 -0
  329. package/src/auth/JwtPayload.ts +11 -0
  330. package/src/auth/KeyCollector.ts +27 -0
  331. package/src/auth/KeySpec.ts +67 -0
  332. package/src/auth/KeyStore.ts +156 -0
  333. package/src/auth/LeakyBucket.ts +66 -0
  334. package/src/auth/RemoteJWKSCollector.ts +130 -0
  335. package/src/auth/StaticKeyCollector.ts +21 -0
  336. package/src/auth/SupabaseKeyCollector.ts +67 -0
  337. package/src/auth/auth-index.ts +10 -0
  338. package/src/db/db-index.ts +1 -0
  339. package/src/db/mongo.ts +72 -0
  340. package/src/entry/cli-entry.ts +40 -0
  341. package/src/entry/commands/config-command.ts +36 -0
  342. package/src/entry/commands/migrate-action.ts +25 -0
  343. package/src/entry/commands/start-action.ts +24 -0
  344. package/src/entry/commands/teardown-action.ts +23 -0
  345. package/src/entry/entry-index.ts +5 -0
  346. package/src/index.ts +40 -0
  347. package/src/locks/LockManager.ts +16 -0
  348. package/src/locks/MongoLocks.ts +142 -0
  349. package/src/locks/locks-index.ts +2 -0
  350. package/src/metrics/Metrics.ts +265 -0
  351. package/src/migrations/db/migrations/1684951997326-init.ts +33 -0
  352. package/src/migrations/db/migrations/1688556755264-initial-sync-rules.ts +5 -0
  353. package/src/migrations/db/migrations/1702295701188-sync-rule-state.ts +99 -0
  354. package/src/migrations/db/migrations/1711543888062-write-checkpoint-index.ts +32 -0
  355. package/src/migrations/definitions.ts +21 -0
  356. package/src/migrations/executor.ts +87 -0
  357. package/src/migrations/migrations-index.ts +3 -0
  358. package/src/migrations/migrations.ts +118 -0
  359. package/src/migrations/store/migration-store.ts +63 -0
  360. package/src/replication/ErrorRateLimiter.ts +50 -0
  361. package/src/replication/PgRelation.ts +42 -0
  362. package/src/replication/WalConnection.ts +227 -0
  363. package/src/replication/WalStream.ts +624 -0
  364. package/src/replication/WalStreamManager.ts +213 -0
  365. package/src/replication/WalStreamRunner.ts +180 -0
  366. package/src/replication/replication-index.ts +7 -0
  367. package/src/replication/util.ts +76 -0
  368. package/src/routes/auth.ts +215 -0
  369. package/src/routes/endpoints/admin.ts +237 -0
  370. package/src/routes/endpoints/checkpointing.ts +41 -0
  371. package/src/routes/endpoints/dev.ts +199 -0
  372. package/src/routes/endpoints/route-endpoints-index.ts +6 -0
  373. package/src/routes/endpoints/socket-route.ts +135 -0
  374. package/src/routes/endpoints/sync-rules.ts +227 -0
  375. package/src/routes/endpoints/sync-stream.ts +101 -0
  376. package/src/routes/hooks.ts +46 -0
  377. package/src/routes/route-register.ts +104 -0
  378. package/src/routes/router-socket.ts +13 -0
  379. package/src/routes/router.ts +46 -0
  380. package/src/routes/routes-index.ts +6 -0
  381. package/src/runner/teardown.ts +108 -0
  382. package/src/storage/BucketStorage.ts +396 -0
  383. package/src/storage/ChecksumCache.ts +294 -0
  384. package/src/storage/MongoBucketStorage.ts +519 -0
  385. package/src/storage/SourceTable.ts +60 -0
  386. package/src/storage/mongo/MongoBucketBatch.ts +752 -0
  387. package/src/storage/mongo/MongoIdSequence.ts +24 -0
  388. package/src/storage/mongo/MongoPersistedSyncRules.ts +16 -0
  389. package/src/storage/mongo/MongoPersistedSyncRulesContent.ts +47 -0
  390. package/src/storage/mongo/MongoSyncBucketStorage.ts +533 -0
  391. package/src/storage/mongo/MongoSyncRulesLock.ts +81 -0
  392. package/src/storage/mongo/OperationBatch.ts +115 -0
  393. package/src/storage/mongo/PersistedBatch.ts +268 -0
  394. package/src/storage/mongo/db.ts +73 -0
  395. package/src/storage/mongo/models.ts +162 -0
  396. package/src/storage/mongo/util.ts +88 -0
  397. package/src/storage/storage-index.ts +15 -0
  398. package/src/sync/BroadcastIterable.ts +161 -0
  399. package/src/sync/LastValueSink.ts +100 -0
  400. package/src/sync/merge.ts +200 -0
  401. package/src/sync/safeRace.ts +99 -0
  402. package/src/sync/sync-index.ts +6 -0
  403. package/src/sync/sync.ts +319 -0
  404. package/src/sync/util.ts +98 -0
  405. package/src/system/CorePowerSyncSystem.ts +64 -0
  406. package/src/system/system-index.ts +1 -0
  407. package/src/util/Mutex.ts +159 -0
  408. package/src/util/PgManager.ts +64 -0
  409. package/src/util/alerting.ts +9 -0
  410. package/src/util/config/collectors/config-collector.ts +143 -0
  411. package/src/util/config/collectors/impl/base64-config-collector.ts +18 -0
  412. package/src/util/config/collectors/impl/fallback-config-collector.ts +22 -0
  413. package/src/util/config/collectors/impl/filesystem-config-collector.ts +43 -0
  414. package/src/util/config/compound-config-collector.ts +176 -0
  415. package/src/util/config/sync-rules/impl/base64-sync-rules-collector.ts +21 -0
  416. package/src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts +26 -0
  417. package/src/util/config/sync-rules/impl/inline-sync-rules-collector.ts +21 -0
  418. package/src/util/config/sync-rules/sync-collector.ts +8 -0
  419. package/src/util/config/types.ts +66 -0
  420. package/src/util/config.ts +39 -0
  421. package/src/util/env.ts +30 -0
  422. package/src/util/memory-tracking.ts +67 -0
  423. package/src/util/migration_lib.ts +79 -0
  424. package/src/util/pgwire_utils.ts +139 -0
  425. package/src/util/populate_test_data.ts +78 -0
  426. package/src/util/protocol-types.ts +228 -0
  427. package/src/util/secs.ts +54 -0
  428. package/src/util/util-index.ts +25 -0
  429. package/src/util/utils.ts +122 -0
  430. package/test/src/__snapshots__/pg_test.test.ts.snap +256 -0
  431. package/test/src/__snapshots__/sync.test.ts.snap +247 -0
  432. package/test/src/auth.test.ts +342 -0
  433. package/test/src/broadcast_iterable.test.ts +156 -0
  434. package/test/src/checksum_cache.test.ts +436 -0
  435. package/test/src/data_storage.test.ts +1176 -0
  436. package/test/src/env.ts +8 -0
  437. package/test/src/large_batch.test.ts +194 -0
  438. package/test/src/merge_iterable.test.ts +355 -0
  439. package/test/src/pg_test.test.ts +450 -0
  440. package/test/src/schema_changes.test.ts +545 -0
  441. package/test/src/setup.ts +7 -0
  442. package/test/src/slow_tests.test.ts +257 -0
  443. package/test/src/sql_functions.test.ts +254 -0
  444. package/test/src/sql_operators.test.ts +132 -0
  445. package/test/src/sync.test.ts +293 -0
  446. package/test/src/sync_rules.test.ts +1053 -0
  447. package/test/src/util.ts +76 -0
  448. package/test/src/validation.test.ts +63 -0
  449. package/test/src/wal_stream.test.ts +319 -0
  450. package/test/src/wal_stream_utils.ts +147 -0
  451. package/test/tsconfig.json +20 -0
  452. package/tsconfig.json +31 -0
  453. package/tsconfig.tsbuildinfo +1 -0
  454. package/vitest.config.ts +9 -0
@@ -0,0 +1,581 @@
1
+ import * as bson from 'bson';
2
+ import * as mongo from 'mongodb';
3
+ import * as util from '../../util/util-index.js';
4
+ import * as replication from '../../replication/replication-index.js';
5
+ import { container, errors, logger } from '@powersync/lib-services-framework';
6
+ import { mergeToast } from '../BucketStorage.js';
7
+ import { SourceTable } from '../SourceTable.js';
8
+ import { MongoIdSequence } from './MongoIdSequence.js';
9
+ import { cacheKey, OperationBatch, RecordOperation } from './OperationBatch.js';
10
+ import { PersistedBatch } from './PersistedBatch.js';
11
+ import { BSON_DESERIALIZE_OPTIONS, idPrefixFilter, serializeLookup } from './util.js';
12
+ /**
13
+ * 15MB
14
+ */
15
+ const MAX_ROW_SIZE = 15 * 1024 * 1024;
16
+ // Currently, we can only have a single flush() at a time, since it locks the op_id sequence.
17
+ // While the MongoDB transaction retry mechanism handles this okay, using an in-process Mutex
18
+ // makes it more fair and has less overhead.
19
+ //
20
+ // In the future, we can investigate allowing multiple replication streams operating independently.
21
+ const replicationMutex = new util.Mutex();
22
+ export class MongoBucketBatch {
23
+ constructor(db, sync_rules, group_id, slot_name, last_checkpoint_lsn, no_checkpoint_before_lsn) {
24
+ this.batch = null;
25
+ /**
26
+ * Last LSN received associated with a checkpoint.
27
+ *
28
+ * This could be either:
29
+ * 1. A commit LSN.
30
+ * 2. A keepalive message LSN.
31
+ */
32
+ this.last_checkpoint_lsn = null;
33
+ this.persisted_op = null;
34
+ /**
35
+ * For tests only - not for persistence logic.
36
+ */
37
+ this.last_flushed_op = null;
38
+ this.db = db;
39
+ this.client = db.client;
40
+ this.sync_rules = sync_rules;
41
+ this.group_id = group_id;
42
+ this.slot_name = slot_name;
43
+ this.session = this.client.startSession();
44
+ this.last_checkpoint_lsn = last_checkpoint_lsn;
45
+ this.no_checkpoint_before_lsn = no_checkpoint_before_lsn ?? replication.ZERO_LSN;
46
+ }
47
+ async flush() {
48
+ let result = null;
49
+ // One flush may be split over multiple transactions.
50
+ // Each flushInner() is one transaction.
51
+ while (this.batch != null) {
52
+ let r = await this.flushInner();
53
+ if (r) {
54
+ result = r;
55
+ }
56
+ }
57
+ return result;
58
+ }
59
+ async flushInner() {
60
+ const batch = this.batch;
61
+ if (batch == null) {
62
+ return null;
63
+ }
64
+ let last_op = null;
65
+ let resumeBatch = null;
66
+ await this.withReplicationTransaction(`Flushing ${batch.length} ops`, async (session, opSeq) => {
67
+ resumeBatch = await this.replicateBatch(session, batch, opSeq);
68
+ last_op = opSeq.last();
69
+ });
70
+ // null if done, set if we need another flush
71
+ this.batch = resumeBatch;
72
+ if (last_op == null) {
73
+ throw new Error('Unexpected last_op == null');
74
+ }
75
+ this.persisted_op = last_op;
76
+ this.last_flushed_op = last_op;
77
+ return { flushed_op: String(last_op) };
78
+ }
79
+ async replicateBatch(session, batch, op_seq) {
80
+ // 1. Find sizes of current_data documents, to assist in intelligent batching without
81
+ // exceeding memory limits.
82
+ //
83
+ // A previous attempt tried to do batching by the results of the current_data query
84
+ // (automatically limited to 48MB(?) per batch by MongoDB). The issue is that it changes
85
+ // the order of processing, which then becomes really tricky to manage.
86
+ // This now takes 2+ queries, but doesn't have any issues with order of operations.
87
+ const sizeLookups = batch.batch.map((r) => {
88
+ return { g: this.group_id, t: r.record.sourceTable.id, k: r.beforeId };
89
+ });
90
+ const sizes = new Map();
91
+ const sizeCursor = this.db.current_data.aggregate([
92
+ {
93
+ $match: {
94
+ _id: { $in: sizeLookups }
95
+ }
96
+ },
97
+ {
98
+ $project: {
99
+ _id: 1,
100
+ size: { $bsonSize: '$$ROOT' }
101
+ }
102
+ }
103
+ ], { session });
104
+ for await (let doc of sizeCursor.stream()) {
105
+ const key = cacheKey(doc._id.t, doc._id.k);
106
+ sizes.set(key, doc.size);
107
+ }
108
+ // If set, we need to start a new transaction with this batch.
109
+ let resumeBatch = null;
110
+ let transactionSize = 0;
111
+ // Now batch according to the sizes
112
+ for await (let b of batch.batched(sizes)) {
113
+ if (resumeBatch) {
114
+ for (let op of b) {
115
+ resumeBatch.push(op);
116
+ }
117
+ continue;
118
+ }
119
+ const lookups = b.map((r) => {
120
+ return { g: this.group_id, t: r.record.sourceTable.id, k: r.beforeId };
121
+ });
122
+ let current_data_lookup = new Map();
123
+ const cursor = this.db.current_data.find({
124
+ _id: { $in: lookups }
125
+ }, { session });
126
+ for await (let doc of cursor.stream()) {
127
+ current_data_lookup.set(cacheKey(doc._id.t, doc._id.k), doc);
128
+ }
129
+ let persistedBatch = new PersistedBatch(this.group_id, transactionSize);
130
+ for (let op of b) {
131
+ if (resumeBatch) {
132
+ resumeBatch.push(op);
133
+ continue;
134
+ }
135
+ const currentData = current_data_lookup.get(op.internalBeforeKey) ?? null;
136
+ if (currentData != null) {
137
+ current_data_lookup.delete(op.internalBeforeKey);
138
+ }
139
+ const nextData = this.saveOperation(persistedBatch, op, currentData, op_seq);
140
+ if (nextData != null) {
141
+ // Update our current_data and size cache
142
+ current_data_lookup.set(op.internalAfterKey, nextData);
143
+ sizes.set(op.internalAfterKey, nextData.data.length());
144
+ }
145
+ if (persistedBatch.shouldFlushTransaction()) {
146
+ // Transaction is getting big.
147
+ // Flush, and resume in a new transaction.
148
+ await persistedBatch.flush(this.db, this.session);
149
+ persistedBatch = null;
150
+ // Computing our current progress is a little tricky here, since
151
+ // we're stopping in the middle of a batch.
152
+ // We create a new batch, and push any remaining operations to it.
153
+ resumeBatch = new OperationBatch();
154
+ }
155
+ }
156
+ if (persistedBatch) {
157
+ transactionSize = persistedBatch.currentSize;
158
+ await persistedBatch.flush(this.db, this.session);
159
+ }
160
+ }
161
+ return resumeBatch;
162
+ }
163
+ saveOperation(batch, operation, current_data, opSeq) {
164
+ const record = operation.record;
165
+ const beforeId = operation.beforeId;
166
+ const afterId = operation.afterId;
167
+ let after = record.after;
168
+ const sourceTable = record.sourceTable;
169
+ let existing_buckets = [];
170
+ let new_buckets = [];
171
+ let existing_lookups = [];
172
+ let new_lookups = [];
173
+ const before_key = { g: this.group_id, t: record.sourceTable.id, k: beforeId };
174
+ if (record.tag == 'update') {
175
+ const result = current_data;
176
+ if (result == null) {
177
+ // Not an error if we re-apply a transaction
178
+ existing_buckets = [];
179
+ existing_lookups = [];
180
+ }
181
+ else {
182
+ const data = bson.deserialize(result.data.buffer, BSON_DESERIALIZE_OPTIONS);
183
+ existing_buckets = result.buckets;
184
+ existing_lookups = result.lookups;
185
+ after = mergeToast(after, data);
186
+ }
187
+ }
188
+ else if (record.tag == 'delete') {
189
+ const result = current_data;
190
+ if (result == null) {
191
+ // Not an error if we re-apply a transaction
192
+ existing_buckets = [];
193
+ existing_lookups = [];
194
+ }
195
+ else {
196
+ existing_buckets = result.buckets;
197
+ existing_lookups = result.lookups;
198
+ }
199
+ }
200
+ let afterData;
201
+ if (afterId) {
202
+ try {
203
+ // This will fail immediately if the record is > 16MB.
204
+ afterData = new bson.Binary(bson.serialize(after));
205
+ // We additionally make sure it's <= 15MB - we need some margin for metadata.
206
+ if (afterData.length() > MAX_ROW_SIZE) {
207
+ throw new Error(`Row too large: ${afterData.length()}`);
208
+ }
209
+ }
210
+ catch (e) {
211
+ // Replace with empty values, equivalent to TOAST values
212
+ after = Object.fromEntries(Object.entries(after).map(([key, value]) => {
213
+ return [key, undefined];
214
+ }));
215
+ afterData = new bson.Binary(bson.serialize(after));
216
+ container.reporter.captureMessage(`Data too big on ${record.sourceTable.qualifiedName}.${record.after?.id}: ${e.message}`, {
217
+ level: errors.ErrorSeverity.WARNING,
218
+ metadata: {
219
+ replication_slot: this.slot_name,
220
+ table: record.sourceTable.qualifiedName
221
+ }
222
+ });
223
+ }
224
+ }
225
+ // 2. Save bucket data
226
+ if (beforeId != null && beforeId != afterId) {
227
+ // Source ID updated
228
+ if (sourceTable.syncData) {
229
+ // Delete old record
230
+ batch.saveBucketData({
231
+ op_seq: opSeq,
232
+ sourceKey: beforeId,
233
+ table: sourceTable,
234
+ before_buckets: existing_buckets,
235
+ evaluated: []
236
+ });
237
+ // Clear this, so we don't also try to REMOVE for the new id
238
+ existing_buckets = [];
239
+ }
240
+ if (sourceTable.syncParameters) {
241
+ // Delete old parameters
242
+ batch.saveParameterData({
243
+ op_seq: opSeq,
244
+ sourceKey: beforeId,
245
+ sourceTable,
246
+ evaluated: [],
247
+ existing_lookups
248
+ });
249
+ existing_lookups = [];
250
+ }
251
+ }
252
+ // If we re-apply a transaction, we can end up with a partial row.
253
+ //
254
+ // We may end up with toasted values, which means the record is not quite valid.
255
+ // However, it will be valid by the end of the transaction.
256
+ //
257
+ // In this case, we don't save the op, but we do save the current data.
258
+ if (afterId && after && util.isCompleteRow(after)) {
259
+ // Insert or update
260
+ if (sourceTable.syncData) {
261
+ const { results: evaluated, errors: syncErrors } = this.sync_rules.evaluateRowWithErrors({
262
+ record: after,
263
+ sourceTable
264
+ });
265
+ for (let error of syncErrors) {
266
+ container.reporter.captureMessage(`Failed to evaluate data query on ${record.sourceTable.qualifiedName}.${record.after?.id}: ${error.error}`, {
267
+ level: errors.ErrorSeverity.WARNING,
268
+ metadata: {
269
+ replication_slot: this.slot_name,
270
+ table: record.sourceTable.qualifiedName
271
+ }
272
+ });
273
+ logger.error(`Failed to evaluate data query on ${record.sourceTable.qualifiedName}.${record.after?.id}: ${error.error}`);
274
+ }
275
+ // Save new one
276
+ batch.saveBucketData({
277
+ op_seq: opSeq,
278
+ sourceKey: afterId,
279
+ evaluated,
280
+ table: sourceTable,
281
+ before_buckets: existing_buckets
282
+ });
283
+ new_buckets = evaluated.map((e) => {
284
+ return {
285
+ bucket: e.bucket,
286
+ table: e.table,
287
+ id: e.id
288
+ };
289
+ });
290
+ }
291
+ if (sourceTable.syncParameters) {
292
+ // Parameters
293
+ const { results: paramEvaluated, errors: paramErrors } = this.sync_rules.evaluateParameterRowWithErrors(sourceTable, after);
294
+ for (let error of paramErrors) {
295
+ container.reporter.captureMessage(`Failed to evaluate parameter query on ${record.sourceTable.qualifiedName}.${record.after?.id}: ${error.error}`, {
296
+ level: errors.ErrorSeverity.WARNING,
297
+ metadata: {
298
+ replication_slot: this.slot_name,
299
+ table: record.sourceTable.qualifiedName
300
+ }
301
+ });
302
+ logger.error(`Failed to evaluate parameter query on ${record.sourceTable.qualifiedName}.${after.id}: ${error.error}`);
303
+ }
304
+ batch.saveParameterData({
305
+ op_seq: opSeq,
306
+ sourceKey: afterId,
307
+ sourceTable,
308
+ evaluated: paramEvaluated,
309
+ existing_lookups
310
+ });
311
+ new_lookups = paramEvaluated.map((p) => {
312
+ return serializeLookup(p.lookup);
313
+ });
314
+ }
315
+ }
316
+ let result = null;
317
+ // 5. TOAST: Update current data and bucket list.
318
+ if (afterId) {
319
+ // Insert or update
320
+ const after_key = { g: this.group_id, t: sourceTable.id, k: afterId };
321
+ batch.upsertCurrentData(after_key, {
322
+ data: afterData,
323
+ buckets: new_buckets,
324
+ lookups: new_lookups
325
+ });
326
+ result = {
327
+ _id: after_key,
328
+ data: afterData,
329
+ buckets: new_buckets,
330
+ lookups: new_lookups
331
+ };
332
+ }
333
+ if (beforeId != afterId) {
334
+ // Either a delete (afterId == null), or replaced the old replication id
335
+ batch.deleteCurrentData(before_key);
336
+ }
337
+ return result;
338
+ }
339
+ async withTransaction(cb) {
340
+ await replicationMutex.exclusiveLock(async () => {
341
+ await this.session.withTransaction(async () => {
342
+ try {
343
+ await cb();
344
+ }
345
+ catch (e) {
346
+ if (e instanceof mongo.MongoError && e.hasErrorLabel('TransientTransactionError')) {
347
+ // Likely write conflict caused by concurrent write stream replicating
348
+ }
349
+ else {
350
+ logger.warn('Transaction error', e);
351
+ }
352
+ await new Promise((resolve) => setTimeout(resolve, Math.random() * 50));
353
+ throw e;
354
+ }
355
+ }, { maxCommitTimeMS: 10000 });
356
+ });
357
+ }
358
+ async withReplicationTransaction(description, callback) {
359
+ let flushTry = 0;
360
+ const start = Date.now();
361
+ const lastTry = start + 90000;
362
+ const session = this.session;
363
+ await this.withTransaction(async () => {
364
+ flushTry += 1;
365
+ if (flushTry % 10 == 0) {
366
+ logger.info(`${this.slot_name} ${description} - try ${flushTry}`);
367
+ }
368
+ if (flushTry > 20 && Date.now() > lastTry) {
369
+ throw new Error('Max transaction tries exceeded');
370
+ }
371
+ const next_op_id_doc = await this.db.op_id_sequence.findOneAndUpdate({
372
+ _id: 'main'
373
+ }, {
374
+ $setOnInsert: { op_id: 0n },
375
+ $set: {
376
+ // Force update to ensure we get a mongo lock
377
+ ts: Date.now()
378
+ }
379
+ }, {
380
+ upsert: true,
381
+ returnDocument: 'after',
382
+ session
383
+ });
384
+ const opSeq = new MongoIdSequence(next_op_id_doc?.op_id ?? 0n);
385
+ await callback(session, opSeq);
386
+ await this.db.op_id_sequence.updateOne({
387
+ _id: 'main'
388
+ }, {
389
+ $set: {
390
+ op_id: opSeq.last()
391
+ }
392
+ }, {
393
+ session
394
+ });
395
+ await this.db.sync_rules.updateOne({
396
+ _id: this.group_id
397
+ }, {
398
+ $set: {
399
+ last_keepalive_ts: new Date()
400
+ }
401
+ }, { session });
402
+ });
403
+ }
404
+ async abort() {
405
+ await this.session.endSession();
406
+ }
407
+ async commit(lsn) {
408
+ await this.flush();
409
+ if (this.last_checkpoint_lsn != null && lsn <= this.last_checkpoint_lsn) {
410
+ // When re-applying transactions, don't create a new checkpoint until
411
+ // we are past the last transaction.
412
+ logger.info(`Re-applied transaction ${lsn} - skipping checkpoint`);
413
+ return false;
414
+ }
415
+ if (lsn < this.no_checkpoint_before_lsn) {
416
+ logger.info(`Waiting until ${this.no_checkpoint_before_lsn} before creating checkpoint, currently at ${lsn}`);
417
+ return false;
418
+ }
419
+ if (this.persisted_op != null) {
420
+ const now = new Date();
421
+ await this.db.sync_rules.updateOne({
422
+ _id: this.group_id
423
+ }, {
424
+ $set: {
425
+ last_checkpoint: this.persisted_op,
426
+ last_checkpoint_lsn: lsn,
427
+ last_checkpoint_ts: now,
428
+ last_keepalive_ts: now,
429
+ snapshot_done: true,
430
+ last_fatal_error: null
431
+ }
432
+ }, { session: this.session });
433
+ this.persisted_op = null;
434
+ }
435
+ this.last_checkpoint_lsn = lsn;
436
+ return true;
437
+ }
438
+ async keepalive(lsn) {
439
+ if (this.last_checkpoint_lsn != null && lsn <= this.last_checkpoint_lsn) {
440
+ // No-op
441
+ return false;
442
+ }
443
+ if (lsn < this.no_checkpoint_before_lsn) {
444
+ return false;
445
+ }
446
+ if (this.persisted_op != null) {
447
+ // The commit may have been skipped due to "no_checkpoint_before_lsn".
448
+ // Apply it now if relevant
449
+ return await this.commit(lsn);
450
+ }
451
+ await this.db.sync_rules.updateOne({
452
+ _id: this.group_id
453
+ }, {
454
+ $set: {
455
+ last_checkpoint_lsn: lsn,
456
+ snapshot_done: true,
457
+ last_fatal_error: null,
458
+ last_keepalive_ts: new Date()
459
+ }
460
+ }, { session: this.session });
461
+ this.last_checkpoint_lsn = lsn;
462
+ return true;
463
+ }
464
+ async save(record) {
465
+ logger.debug(`Saving ${record.tag}:${record.before?.id}/${record.after?.id}`);
466
+ this.batch ?? (this.batch = new OperationBatch());
467
+ this.batch.push(new RecordOperation(record));
468
+ if (this.batch.shouldFlush()) {
469
+ const r = await this.flush();
470
+ // HACK: Give other streams a chance to also flush
471
+ const t = 150;
472
+ await new Promise((resolve) => setTimeout(resolve, t));
473
+ return r;
474
+ }
475
+ return null;
476
+ }
477
+ /**
478
+ * Drop is equivalent to TRUNCATE, plus removing our record of the table.
479
+ */
480
+ async drop(sourceTables) {
481
+ await this.truncate(sourceTables);
482
+ const result = await this.flush();
483
+ await this.withTransaction(async () => {
484
+ for (let table of sourceTables) {
485
+ await this.db.source_tables.deleteOne({ _id: table.id });
486
+ }
487
+ });
488
+ return result;
489
+ }
490
+ async truncate(sourceTables) {
491
+ await this.flush();
492
+ let last_op = null;
493
+ for (let table of sourceTables) {
494
+ last_op = await this.truncateSingle(table);
495
+ }
496
+ if (last_op) {
497
+ this.persisted_op = last_op;
498
+ }
499
+ return {
500
+ flushed_op: String(last_op)
501
+ };
502
+ }
503
+ async truncateSingle(sourceTable) {
504
+ let last_op = null;
505
+ // To avoid too large transactions, we limit the amount of data we delete per transaction.
506
+ // Since we don't use the record data here, we don't have explicit size limits per batch.
507
+ const BATCH_LIMIT = 2000;
508
+ let lastBatchCount = BATCH_LIMIT;
509
+ while (lastBatchCount == BATCH_LIMIT) {
510
+ await this.withReplicationTransaction(`Truncate ${sourceTable.qualifiedName}`, async (session, opSeq) => {
511
+ const current_data_filter = {
512
+ _id: idPrefixFilter({ g: this.group_id, t: sourceTable.id }, ['k'])
513
+ };
514
+ const cursor = this.db.current_data.find(current_data_filter, {
515
+ projection: {
516
+ _id: 1,
517
+ buckets: 1,
518
+ lookups: 1
519
+ },
520
+ limit: BATCH_LIMIT,
521
+ session: session
522
+ });
523
+ const batch = await cursor.toArray();
524
+ const persistedBatch = new PersistedBatch(this.group_id, 0);
525
+ for (let value of batch) {
526
+ persistedBatch.saveBucketData({
527
+ op_seq: opSeq,
528
+ before_buckets: value.buckets,
529
+ evaluated: [],
530
+ table: sourceTable,
531
+ sourceKey: value._id.k
532
+ });
533
+ persistedBatch.saveParameterData({
534
+ op_seq: opSeq,
535
+ existing_lookups: value.lookups,
536
+ evaluated: [],
537
+ sourceTable: sourceTable,
538
+ sourceKey: value._id.k
539
+ });
540
+ persistedBatch.deleteCurrentData(value._id);
541
+ }
542
+ await persistedBatch.flush(this.db, session);
543
+ lastBatchCount = batch.length;
544
+ last_op = opSeq.last();
545
+ });
546
+ }
547
+ return last_op;
548
+ }
549
+ async markSnapshotDone(tables, no_checkpoint_before_lsn) {
550
+ const session = this.session;
551
+ const ids = tables.map((table) => table.id);
552
+ await this.withTransaction(async () => {
553
+ await this.db.source_tables.updateMany({ _id: { $in: ids } }, {
554
+ $set: {
555
+ snapshot_done: true
556
+ }
557
+ }, { session });
558
+ if (no_checkpoint_before_lsn > this.no_checkpoint_before_lsn) {
559
+ this.no_checkpoint_before_lsn = no_checkpoint_before_lsn;
560
+ await this.db.sync_rules.updateOne({
561
+ _id: this.group_id
562
+ }, {
563
+ $set: {
564
+ no_checkpoint_before: no_checkpoint_before_lsn,
565
+ last_keepalive_ts: new Date()
566
+ }
567
+ }, { session: this.session });
568
+ }
569
+ });
570
+ return tables.map((table) => {
571
+ const copy = new SourceTable(table.id, table.connectionTag, table.relationId, table.schema, table.table, table.replicaIdColumns, table.snapshotComplete);
572
+ copy.syncData = table.syncData;
573
+ copy.syncParameters = table.syncParameters;
574
+ return copy;
575
+ });
576
+ }
577
+ }
578
+ export function currentBucketKey(b) {
579
+ return `${b.bucket}/${b.table}/${b.id}`;
580
+ }
581
+ //# sourceMappingURL=MongoBucketBatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoBucketBatch.js","sourceRoot":"","sources":["../../../src/storage/mongo/MongoBucketBatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Manages op_id or similar sequence in memory.
3
+ *
4
+ * This is typically used within a transaction, with the last value persisted
5
+ * at the end of the transaction.
6
+ */
7
+ export declare class MongoIdSequence {
8
+ private _last;
9
+ constructor(last: bigint);
10
+ next(): bigint;
11
+ last(): bigint;
12
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Manages op_id or similar sequence in memory.
3
+ *
4
+ * This is typically used within a transaction, with the last value persisted
5
+ * at the end of the transaction.
6
+ */
7
+ export class MongoIdSequence {
8
+ constructor(last) {
9
+ if (typeof last != 'bigint') {
10
+ throw new Error(`BigInt required, got ${last} ${typeof last}`);
11
+ }
12
+ this._last = last;
13
+ }
14
+ next() {
15
+ return ++this._last;
16
+ }
17
+ last() {
18
+ return this._last;
19
+ }
20
+ }
21
+ //# sourceMappingURL=MongoIdSequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoIdSequence.js","sourceRoot":"","sources":["../../../src/storage/mongo/MongoIdSequence.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IAG1B,YAAY,IAAY;QACtB,IAAI,OAAO,IAAI,IAAI,QAAQ,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC;SAChE;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI;QACF,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { SqlSyncRules } from '@powersync/service-sync-rules';
2
+ import { PersistedSyncRules } from '../BucketStorage.js';
3
+ export declare class MongoPersistedSyncRules implements PersistedSyncRules {
4
+ readonly id: number;
5
+ readonly sync_rules: SqlSyncRules;
6
+ readonly checkpoint_lsn: string | null;
7
+ readonly slot_name: string;
8
+ constructor(id: number, sync_rules: SqlSyncRules, checkpoint_lsn: string | null, slot_name: string | null);
9
+ }
@@ -0,0 +1,9 @@
1
+ export class MongoPersistedSyncRules {
2
+ constructor(id, sync_rules, checkpoint_lsn, slot_name) {
3
+ this.id = id;
4
+ this.sync_rules = sync_rules;
5
+ this.checkpoint_lsn = checkpoint_lsn;
6
+ this.slot_name = slot_name ?? `powersync_${id}`;
7
+ }
8
+ }
9
+ //# sourceMappingURL=MongoPersistedSyncRules.js.map