@powersync/service-core 0.8.7 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/api/RouteAPI.d.ts +67 -0
  3. package/dist/api/RouteAPI.js +2 -0
  4. package/dist/api/RouteAPI.js.map +1 -0
  5. package/dist/api/api-index.d.ts +1 -0
  6. package/dist/api/api-index.js +1 -0
  7. package/dist/api/api-index.js.map +1 -1
  8. package/dist/api/diagnostics.d.ts +4 -4
  9. package/dist/api/diagnostics.js +170 -158
  10. package/dist/api/diagnostics.js.map +1 -1
  11. package/dist/api/schema.d.ts +3 -5
  12. package/dist/api/schema.js +14 -80
  13. package/dist/api/schema.js.map +1 -1
  14. package/dist/auth/CachedKeyCollector.js.map +1 -1
  15. package/dist/auth/KeySpec.js.map +1 -1
  16. package/dist/auth/KeyStore.d.ts +7 -4
  17. package/dist/auth/KeyStore.js +1 -1
  18. package/dist/auth/KeyStore.js.map +1 -1
  19. package/dist/auth/LeakyBucket.js.map +1 -1
  20. package/dist/auth/RemoteJWKSCollector.d.ts +0 -2
  21. package/dist/auth/RemoteJWKSCollector.js.map +1 -1
  22. package/dist/auth/auth-index.d.ts +0 -1
  23. package/dist/auth/auth-index.js +0 -1
  24. package/dist/auth/auth-index.js.map +1 -1
  25. package/dist/db/mongo.js +5 -3
  26. package/dist/db/mongo.js.map +1 -1
  27. package/dist/entry/cli-entry.js +3 -2
  28. package/dist/entry/cli-entry.js.map +1 -1
  29. package/dist/entry/commands/compact-action.js +90 -14
  30. package/dist/entry/commands/compact-action.js.map +1 -1
  31. package/dist/entry/commands/migrate-action.js +4 -5
  32. package/dist/entry/commands/migrate-action.js.map +1 -1
  33. package/dist/entry/commands/teardown-action.js +2 -2
  34. package/dist/entry/commands/teardown-action.js.map +1 -1
  35. package/dist/index.d.ts +4 -2
  36. package/dist/index.js +4 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/locks/MongoLocks.js.map +1 -1
  39. package/dist/metrics/Metrics.d.ts +2 -2
  40. package/dist/metrics/Metrics.js +5 -13
  41. package/dist/metrics/Metrics.js.map +1 -1
  42. package/dist/migrations/db/migrations/1684951997326-init.d.ts +2 -2
  43. package/dist/migrations/db/migrations/1684951997326-init.js +4 -2
  44. package/dist/migrations/db/migrations/1684951997326-init.js.map +1 -1
  45. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.d.ts +2 -2
  46. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js +4 -2
  47. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -1
  48. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.d.ts +2 -2
  49. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js +4 -2
  50. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js.map +1 -1
  51. package/dist/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.d.ts +3 -0
  52. package/dist/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.js +31 -0
  53. package/dist/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.js.map +1 -0
  54. package/dist/migrations/executor.js.map +1 -1
  55. package/dist/migrations/migrations.d.ts +8 -0
  56. package/dist/migrations/migrations.js +19 -7
  57. package/dist/migrations/migrations.js.map +1 -1
  58. package/dist/migrations/store/migration-store.js.map +1 -1
  59. package/dist/modules/AbstractModule.d.ts +26 -0
  60. package/dist/modules/AbstractModule.js +11 -0
  61. package/dist/modules/AbstractModule.js.map +1 -0
  62. package/dist/modules/ModuleManager.d.ts +11 -0
  63. package/dist/modules/ModuleManager.js +32 -0
  64. package/dist/modules/ModuleManager.js.map +1 -0
  65. package/dist/modules/modules-index.d.ts +2 -0
  66. package/dist/modules/modules-index.js +3 -0
  67. package/dist/modules/modules-index.js.map +1 -0
  68. package/dist/replication/AbstractReplicationJob.d.ts +37 -0
  69. package/dist/replication/AbstractReplicationJob.js +51 -0
  70. package/dist/replication/AbstractReplicationJob.js.map +1 -0
  71. package/dist/replication/AbstractReplicator.d.ts +53 -0
  72. package/dist/replication/AbstractReplicator.js +250 -0
  73. package/dist/replication/AbstractReplicator.js.map +1 -0
  74. package/dist/replication/ErrorRateLimiter.d.ts +0 -10
  75. package/dist/replication/ErrorRateLimiter.js +1 -42
  76. package/dist/replication/ErrorRateLimiter.js.map +1 -1
  77. package/dist/replication/ReplicationEngine.d.ts +18 -0
  78. package/dist/replication/ReplicationEngine.js +41 -0
  79. package/dist/replication/ReplicationEngine.js.map +1 -0
  80. package/dist/replication/ReplicationModule.d.ts +51 -0
  81. package/dist/replication/ReplicationModule.js +68 -0
  82. package/dist/replication/ReplicationModule.js.map +1 -0
  83. package/dist/replication/replication-index.d.ts +4 -6
  84. package/dist/replication/replication-index.js +4 -6
  85. package/dist/replication/replication-index.js.map +1 -1
  86. package/dist/routes/RouterEngine.d.ts +42 -0
  87. package/dist/routes/RouterEngine.js +80 -0
  88. package/dist/routes/RouterEngine.js.map +1 -0
  89. package/dist/routes/auth.d.ts +2 -2
  90. package/dist/routes/auth.js +11 -11
  91. package/dist/routes/auth.js.map +1 -1
  92. package/dist/routes/configure-fastify.d.ts +37 -7
  93. package/dist/routes/configure-fastify.js +20 -19
  94. package/dist/routes/configure-fastify.js.map +1 -1
  95. package/dist/routes/configure-rsocket.d.ts +3 -4
  96. package/dist/routes/configure-rsocket.js +7 -4
  97. package/dist/routes/configure-rsocket.js.map +1 -1
  98. package/dist/routes/endpoints/admin.d.ts +30 -0
  99. package/dist/routes/endpoints/admin.js +46 -67
  100. package/dist/routes/endpoints/admin.js.map +1 -1
  101. package/dist/routes/endpoints/checkpointing.js +103 -15
  102. package/dist/routes/endpoints/checkpointing.js.map +1 -1
  103. package/dist/routes/endpoints/probes.d.ts +74 -0
  104. package/dist/routes/endpoints/probes.js +51 -0
  105. package/dist/routes/endpoints/probes.js.map +1 -0
  106. package/dist/routes/endpoints/socket-route.js +8 -6
  107. package/dist/routes/endpoints/socket-route.js.map +1 -1
  108. package/dist/routes/endpoints/sync-rules.d.ts +1 -1
  109. package/dist/routes/endpoints/sync-rules.js +32 -23
  110. package/dist/routes/endpoints/sync-rules.js.map +1 -1
  111. package/dist/routes/endpoints/sync-stream.d.ts +0 -1
  112. package/dist/routes/endpoints/sync-stream.js +8 -8
  113. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  114. package/dist/routes/hooks.js.map +1 -1
  115. package/dist/routes/route-register.js.map +1 -1
  116. package/dist/routes/router.d.ts +11 -4
  117. package/dist/routes/router.js.map +1 -1
  118. package/dist/routes/routes-index.d.ts +1 -0
  119. package/dist/routes/routes-index.js +1 -0
  120. package/dist/routes/routes-index.js.map +1 -1
  121. package/dist/runner/teardown.js +109 -76
  122. package/dist/runner/teardown.js.map +1 -1
  123. package/dist/storage/BucketStorage.d.ts +86 -36
  124. package/dist/storage/BucketStorage.js +6 -10
  125. package/dist/storage/BucketStorage.js.map +1 -1
  126. package/dist/storage/ChecksumCache.js.map +1 -1
  127. package/dist/storage/MongoBucketStorage.d.ts +7 -11
  128. package/dist/storage/MongoBucketStorage.js +48 -41
  129. package/dist/storage/MongoBucketStorage.js.map +1 -1
  130. package/dist/storage/ReplicationEventPayload.d.ts +14 -0
  131. package/dist/storage/ReplicationEventPayload.js +2 -0
  132. package/dist/storage/ReplicationEventPayload.js.map +1 -0
  133. package/dist/storage/SourceEntity.d.ts +20 -0
  134. package/dist/storage/SourceEntity.js +2 -0
  135. package/dist/storage/SourceEntity.js.map +1 -0
  136. package/dist/storage/SourceTable.d.ts +12 -5
  137. package/dist/storage/SourceTable.js +12 -5
  138. package/dist/storage/SourceTable.js.map +1 -1
  139. package/dist/storage/StorageEngine.d.ts +28 -0
  140. package/dist/storage/StorageEngine.js +45 -0
  141. package/dist/storage/StorageEngine.js.map +1 -0
  142. package/dist/storage/StorageProvider.d.ts +21 -0
  143. package/dist/storage/StorageProvider.js +2 -0
  144. package/dist/storage/StorageProvider.js.map +1 -0
  145. package/dist/storage/WriteCheckpointAPI.d.ts +74 -0
  146. package/dist/storage/WriteCheckpointAPI.js +16 -0
  147. package/dist/storage/WriteCheckpointAPI.js.map +1 -0
  148. package/dist/storage/mongo/MongoBucketBatch.d.ts +24 -5
  149. package/dist/storage/mongo/MongoBucketBatch.js +119 -62
  150. package/dist/storage/mongo/MongoBucketBatch.js.map +1 -1
  151. package/dist/storage/mongo/MongoCompactor.js +20 -3
  152. package/dist/storage/mongo/MongoCompactor.js.map +1 -1
  153. package/dist/storage/mongo/MongoIdSequence.js.map +1 -1
  154. package/dist/storage/mongo/MongoPersistedSyncRulesContent.d.ts +2 -2
  155. package/dist/storage/mongo/MongoPersistedSyncRulesContent.js +2 -2
  156. package/dist/storage/mongo/MongoPersistedSyncRulesContent.js.map +1 -1
  157. package/dist/storage/mongo/MongoStorageProvider.d.ts +5 -0
  158. package/dist/storage/mongo/MongoStorageProvider.js +26 -0
  159. package/dist/storage/mongo/MongoStorageProvider.js.map +1 -0
  160. package/dist/storage/mongo/MongoSyncBucketStorage.d.ts +18 -10
  161. package/dist/storage/mongo/MongoSyncBucketStorage.js +140 -25
  162. package/dist/storage/mongo/MongoSyncBucketStorage.js.map +1 -1
  163. package/dist/storage/mongo/MongoSyncRulesLock.js +1 -1
  164. package/dist/storage/mongo/MongoSyncRulesLock.js.map +1 -1
  165. package/dist/storage/mongo/MongoWriteCheckpointAPI.d.ts +20 -0
  166. package/dist/storage/mongo/MongoWriteCheckpointAPI.js +103 -0
  167. package/dist/storage/mongo/MongoWriteCheckpointAPI.js.map +1 -0
  168. package/dist/storage/mongo/OperationBatch.d.ts +13 -4
  169. package/dist/storage/mongo/OperationBatch.js +25 -7
  170. package/dist/storage/mongo/OperationBatch.js.map +1 -1
  171. package/dist/storage/mongo/PersistedBatch.d.ts +3 -3
  172. package/dist/storage/mongo/PersistedBatch.js +2 -2
  173. package/dist/storage/mongo/PersistedBatch.js.map +1 -1
  174. package/dist/storage/mongo/config.d.ts +19 -0
  175. package/dist/storage/mongo/config.js +26 -0
  176. package/dist/storage/mongo/config.js.map +1 -0
  177. package/dist/storage/mongo/db.d.ts +3 -2
  178. package/dist/storage/mongo/db.js +1 -0
  179. package/dist/storage/mongo/db.js.map +1 -1
  180. package/dist/storage/mongo/models.d.ts +20 -5
  181. package/dist/storage/mongo/models.js.map +1 -1
  182. package/dist/storage/mongo/util.d.ts +12 -1
  183. package/dist/storage/mongo/util.js +50 -2
  184. package/dist/storage/mongo/util.js.map +1 -1
  185. package/dist/storage/storage-index.d.ts +8 -2
  186. package/dist/storage/storage-index.js +8 -2
  187. package/dist/storage/storage-index.js.map +1 -1
  188. package/dist/sync/BroadcastIterable.d.ts +0 -1
  189. package/dist/sync/BroadcastIterable.js.map +1 -1
  190. package/dist/sync/LastValueSink.d.ts +0 -1
  191. package/dist/sync/LastValueSink.js.map +1 -1
  192. package/dist/sync/merge.d.ts +0 -1
  193. package/dist/sync/merge.js.map +1 -1
  194. package/dist/sync/safeRace.js.map +1 -1
  195. package/dist/sync/sync.d.ts +1 -1
  196. package/dist/sync/sync.js +5 -5
  197. package/dist/sync/sync.js.map +1 -1
  198. package/dist/sync/util.d.ts +0 -2
  199. package/dist/sync/util.js.map +1 -1
  200. package/dist/system/ServiceContext.d.ts +37 -0
  201. package/dist/system/ServiceContext.js +48 -0
  202. package/dist/system/ServiceContext.js.map +1 -0
  203. package/dist/system/system-index.d.ts +1 -1
  204. package/dist/system/system-index.js +1 -1
  205. package/dist/system/system-index.js.map +1 -1
  206. package/dist/util/Mutex.js.map +1 -1
  207. package/dist/util/config/collectors/config-collector.js.map +1 -1
  208. package/dist/util/config/collectors/impl/base64-config-collector.js.map +1 -1
  209. package/dist/util/config/collectors/impl/filesystem-config-collector.js.map +1 -1
  210. package/dist/util/config/compound-config-collector.d.ts +9 -2
  211. package/dist/util/config/compound-config-collector.js +16 -24
  212. package/dist/util/config/compound-config-collector.js.map +1 -1
  213. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -1
  214. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
  215. package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js.map +1 -1
  216. package/dist/util/config/sync-rules/sync-rules-provider.d.ts +9 -0
  217. package/dist/util/config/sync-rules/sync-rules-provider.js +15 -0
  218. package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -0
  219. package/dist/util/config/types.d.ts +7 -4
  220. package/dist/util/config/types.js.map +1 -1
  221. package/dist/util/config.d.ts +3 -4
  222. package/dist/util/config.js +5 -20
  223. package/dist/util/config.js.map +1 -1
  224. package/dist/util/memory-tracking.js.map +1 -1
  225. package/dist/util/secs.js.map +1 -1
  226. package/dist/util/util-index.d.ts +3 -6
  227. package/dist/util/util-index.js +3 -6
  228. package/dist/util/util-index.js.map +1 -1
  229. package/dist/util/utils.d.ts +10 -7
  230. package/dist/util/utils.js +36 -25
  231. package/dist/util/utils.js.map +1 -1
  232. package/package.json +8 -12
  233. package/src/api/RouteAPI.ts +78 -0
  234. package/src/api/api-index.ts +1 -0
  235. package/src/api/diagnostics.ts +18 -70
  236. package/src/api/schema.ts +18 -90
  237. package/src/auth/KeyStore.ts +9 -6
  238. package/src/auth/RemoteJWKSCollector.ts +4 -1
  239. package/src/auth/auth-index.ts +0 -1
  240. package/src/db/mongo.ts +5 -3
  241. package/src/entry/cli-entry.ts +3 -2
  242. package/src/entry/commands/compact-action.ts +24 -12
  243. package/src/entry/commands/migrate-action.ts +5 -8
  244. package/src/entry/commands/teardown-action.ts +2 -2
  245. package/src/index.ts +5 -2
  246. package/src/metrics/Metrics.ts +6 -16
  247. package/src/migrations/db/migrations/1684951997326-init.ts +9 -4
  248. package/src/migrations/db/migrations/1702295701188-sync-rule-state.ts +7 -4
  249. package/src/migrations/db/migrations/1711543888062-write-checkpoint-index.ts +6 -4
  250. package/src/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.ts +37 -0
  251. package/src/migrations/migrations.ts +24 -8
  252. package/src/modules/AbstractModule.ts +37 -0
  253. package/src/modules/ModuleManager.ts +34 -0
  254. package/src/modules/modules-index.ts +2 -0
  255. package/src/replication/AbstractReplicationJob.ts +79 -0
  256. package/src/replication/AbstractReplicator.ts +228 -0
  257. package/src/replication/ErrorRateLimiter.ts +0 -44
  258. package/src/replication/ReplicationEngine.ts +43 -0
  259. package/src/replication/ReplicationModule.ts +122 -0
  260. package/src/replication/replication-index.ts +4 -6
  261. package/src/routes/RouterEngine.ts +120 -0
  262. package/src/routes/auth.ts +21 -12
  263. package/src/routes/configure-fastify.ts +28 -28
  264. package/src/routes/configure-rsocket.ts +13 -8
  265. package/src/routes/endpoints/admin.ts +72 -76
  266. package/src/routes/endpoints/checkpointing.ts +51 -11
  267. package/src/routes/endpoints/probes.ts +58 -0
  268. package/src/routes/endpoints/socket-route.ts +10 -6
  269. package/src/routes/endpoints/sync-rules.ts +41 -25
  270. package/src/routes/endpoints/sync-stream.ts +8 -8
  271. package/src/routes/router.ts +10 -5
  272. package/src/routes/routes-index.ts +1 -0
  273. package/src/runner/teardown.ts +50 -88
  274. package/src/storage/BucketStorage.ts +103 -41
  275. package/src/storage/MongoBucketStorage.ts +65 -53
  276. package/src/storage/ReplicationEventPayload.ts +16 -0
  277. package/src/storage/SourceEntity.ts +22 -0
  278. package/src/storage/SourceTable.ts +14 -7
  279. package/src/storage/StorageEngine.ts +62 -0
  280. package/src/storage/StorageProvider.ts +27 -0
  281. package/src/storage/WriteCheckpointAPI.ts +85 -0
  282. package/src/storage/mongo/MongoBucketBatch.ts +164 -84
  283. package/src/storage/mongo/MongoCompactor.ts +25 -4
  284. package/src/storage/mongo/MongoPersistedSyncRulesContent.ts +7 -4
  285. package/src/storage/mongo/MongoStorageProvider.ts +31 -0
  286. package/src/storage/mongo/MongoSyncBucketStorage.ts +118 -41
  287. package/src/storage/mongo/MongoSyncRulesLock.ts +7 -3
  288. package/src/storage/mongo/MongoWriteCheckpointAPI.ts +151 -0
  289. package/src/storage/mongo/OperationBatch.ts +28 -12
  290. package/src/storage/mongo/PersistedBatch.ts +10 -6
  291. package/src/storage/mongo/config.ts +40 -0
  292. package/src/storage/mongo/db.ts +4 -1
  293. package/src/storage/mongo/models.ts +21 -5
  294. package/src/storage/mongo/util.ts +48 -3
  295. package/src/storage/storage-index.ts +8 -2
  296. package/src/sync/sync.ts +7 -4
  297. package/src/sync/util.ts +0 -1
  298. package/src/system/ServiceContext.ts +68 -0
  299. package/src/system/system-index.ts +1 -1
  300. package/src/util/config/compound-config-collector.ts +31 -31
  301. package/src/util/config/sync-rules/sync-rules-provider.ts +18 -0
  302. package/src/util/config/types.ts +7 -5
  303. package/src/util/config.ts +6 -23
  304. package/src/util/util-index.ts +3 -6
  305. package/src/util/utils.ts +48 -41
  306. package/test/src/__snapshots__/sync.test.ts.snap +14 -14
  307. package/test/src/auth.test.ts +7 -7
  308. package/test/src/broadcast_iterable.test.ts +1 -1
  309. package/test/src/compacting.test.ts +50 -40
  310. package/test/src/data_storage.test.ts +382 -202
  311. package/test/src/env.ts +1 -3
  312. package/test/src/merge_iterable.test.ts +1 -6
  313. package/test/src/routes/probes.integration.test.ts +235 -0
  314. package/test/src/routes/probes.test.ts +153 -0
  315. package/test/src/setup.ts +1 -1
  316. package/test/src/stream_utils.ts +42 -0
  317. package/test/src/sync.test.ts +115 -39
  318. package/test/src/util.ts +48 -51
  319. package/test/tsconfig.json +1 -1
  320. package/tsconfig.tsbuildinfo +1 -1
  321. package/vitest.config.ts +7 -1
  322. package/dist/auth/SupabaseKeyCollector.d.ts +0 -22
  323. package/dist/auth/SupabaseKeyCollector.js +0 -61
  324. package/dist/auth/SupabaseKeyCollector.js.map +0 -1
  325. package/dist/replication/PgRelation.d.ts +0 -16
  326. package/dist/replication/PgRelation.js +0 -26
  327. package/dist/replication/PgRelation.js.map +0 -1
  328. package/dist/replication/WalConnection.d.ts +0 -34
  329. package/dist/replication/WalConnection.js +0 -190
  330. package/dist/replication/WalConnection.js.map +0 -1
  331. package/dist/replication/WalStream.d.ts +0 -57
  332. package/dist/replication/WalStream.js +0 -519
  333. package/dist/replication/WalStream.js.map +0 -1
  334. package/dist/replication/WalStreamManager.d.ts +0 -30
  335. package/dist/replication/WalStreamManager.js +0 -198
  336. package/dist/replication/WalStreamManager.js.map +0 -1
  337. package/dist/replication/WalStreamRunner.d.ts +0 -38
  338. package/dist/replication/WalStreamRunner.js +0 -155
  339. package/dist/replication/WalStreamRunner.js.map +0 -1
  340. package/dist/replication/util.d.ts +0 -9
  341. package/dist/replication/util.js +0 -62
  342. package/dist/replication/util.js.map +0 -1
  343. package/dist/system/CorePowerSyncSystem.d.ts +0 -23
  344. package/dist/system/CorePowerSyncSystem.js +0 -52
  345. package/dist/system/CorePowerSyncSystem.js.map +0 -1
  346. package/dist/util/PgManager.d.ts +0 -24
  347. package/dist/util/PgManager.js +0 -55
  348. package/dist/util/PgManager.js.map +0 -1
  349. package/dist/util/migration_lib.d.ts +0 -11
  350. package/dist/util/migration_lib.js +0 -64
  351. package/dist/util/migration_lib.js.map +0 -1
  352. package/dist/util/pgwire_utils.d.ts +0 -24
  353. package/dist/util/pgwire_utils.js +0 -117
  354. package/dist/util/pgwire_utils.js.map +0 -1
  355. package/dist/util/populate_test_data.d.ts +0 -8
  356. package/dist/util/populate_test_data.js +0 -65
  357. package/dist/util/populate_test_data.js.map +0 -1
  358. package/src/auth/SupabaseKeyCollector.ts +0 -67
  359. package/src/replication/PgRelation.ts +0 -42
  360. package/src/replication/WalConnection.ts +0 -227
  361. package/src/replication/WalStream.ts +0 -631
  362. package/src/replication/WalStreamManager.ts +0 -213
  363. package/src/replication/WalStreamRunner.ts +0 -180
  364. package/src/replication/util.ts +0 -76
  365. package/src/system/CorePowerSyncSystem.ts +0 -64
  366. package/src/util/PgManager.ts +0 -64
  367. package/src/util/migration_lib.ts +0 -79
  368. package/src/util/pgwire_utils.ts +0 -139
  369. package/src/util/populate_test_data.ts +0 -78
  370. package/test/src/__snapshots__/pg_test.test.ts.snap +0 -256
  371. package/test/src/large_batch.test.ts +0 -194
  372. package/test/src/pg_test.test.ts +0 -450
  373. package/test/src/schema_changes.test.ts +0 -545
  374. package/test/src/slow_tests.test.ts +0 -338
  375. package/test/src/validation.test.ts +0 -63
  376. package/test/src/wal_stream.test.ts +0 -319
  377. package/test/src/wal_stream_utils.ts +0 -156
@@ -1,198 +0,0 @@
1
- import { hrtime } from 'node:process';
2
- import * as util from '../util/util-index.js';
3
- import { DefaultErrorRateLimiter } from './ErrorRateLimiter.js';
4
- import { WalStreamRunner } from './WalStreamRunner.js';
5
- import { container, logger } from '@powersync/lib-services-framework';
6
- // 5 minutes
7
- const PING_INTERVAL = 1000000000n * 300n;
8
- export class WalStreamManager {
9
- constructor(system) {
10
- this.streams = new Map();
11
- this.stopped = false;
12
- // First ping is only after 5 minutes, not when starting
13
- this.lastPing = hrtime.bigint();
14
- /**
15
- * This limits the effect of retries when there is a persistent issue.
16
- */
17
- this.rateLimiter = new DefaultErrorRateLimiter();
18
- this.system = system;
19
- this.storage = system.storage;
20
- }
21
- start() {
22
- this.runLoop().catch((e) => {
23
- logger.error(`Fatal WalStream error`, e);
24
- container.reporter.captureException(e);
25
- setTimeout(() => {
26
- process.exit(1);
27
- }, 1000);
28
- });
29
- }
30
- async stop() {
31
- this.stopped = true;
32
- let promises = [];
33
- for (let stream of this.streams.values()) {
34
- promises.push(stream.stop());
35
- }
36
- await Promise.all(promises);
37
- }
38
- async runLoop() {
39
- const configured_sync_rules = await util.loadSyncRules(this.system.config);
40
- let configured_lock = undefined;
41
- if (configured_sync_rules != null) {
42
- logger.info('Loading sync rules from configuration');
43
- try {
44
- // Configure new sync rules, if it has changed.
45
- // In that case, also immediately take out a lock, so that another process doesn't start replication on it.
46
- const { updated, persisted_sync_rules, lock } = await this.storage.configureSyncRules(configured_sync_rules, {
47
- lock: true
48
- });
49
- if (lock) {
50
- configured_lock = lock;
51
- }
52
- }
53
- catch (e) {
54
- // Log, but continue with previous sync rules
55
- logger.error(`Failed to load sync rules from configuration`, e);
56
- }
57
- }
58
- else {
59
- logger.info('No sync rules configured - configure via API');
60
- }
61
- while (!this.stopped) {
62
- await container.probes.touch();
63
- try {
64
- const pool = this.system.pgwire_pool;
65
- if (pool) {
66
- await this.refresh({ configured_lock });
67
- // The lock is only valid on the first refresh.
68
- configured_lock = undefined;
69
- // TODO: Ping on all connections when we have multiple
70
- // Perhaps WalStreamRunner would be a better place to do pings?
71
- // We don't ping while in error retry back-off, to avoid having too
72
- // many authentication failures.
73
- if (this.rateLimiter.mayPing()) {
74
- await this.ping(pool);
75
- }
76
- }
77
- }
78
- catch (e) {
79
- logger.error(`Failed to refresh wal streams`, e);
80
- }
81
- await new Promise((resolve) => setTimeout(resolve, 5000));
82
- }
83
- }
84
- /**
85
- * Postgres on RDS writes performs a WAL checkpoint every 5 minutes by default, which creates a new 64MB file.
86
- *
87
- * The old WAL files are only deleted once no replication slot still references it.
88
- *
89
- * Unfortunately, when there are no changes to the db, the database creates new WAL files without the replication slot
90
- * advancing**.
91
- *
92
- * As a workaround, we write a new message every couple of minutes, to make sure that the replication slot advances.
93
- *
94
- * **This may be a bug in pgwire or how we're using it.
95
- */
96
- async ping(db) {
97
- const now = hrtime.bigint();
98
- if (now - this.lastPing >= PING_INTERVAL) {
99
- try {
100
- await db.query(`SELECT * FROM pg_logical_emit_message(false, 'powersync', 'ping')`);
101
- }
102
- catch (e) {
103
- logger.warn(`Failed to ping`, e);
104
- }
105
- this.lastPing = now;
106
- }
107
- }
108
- async refresh(options) {
109
- if (this.stopped) {
110
- return;
111
- }
112
- let configured_lock = options?.configured_lock;
113
- const existingStreams = new Map(this.streams.entries());
114
- const replicating = await this.storage.getReplicatingSyncRules();
115
- const newStreams = new Map();
116
- for (let syncRules of replicating) {
117
- const existing = existingStreams.get(syncRules.id);
118
- if (existing && !existing.stopped) {
119
- // No change
120
- existingStreams.delete(syncRules.id);
121
- newStreams.set(syncRules.id, existing);
122
- }
123
- else if (existing && existing.stopped) {
124
- // Stopped (e.g. fatal error, slot rename).
125
- // Remove from the list. Next refresh call will restart the stream.
126
- existingStreams.delete(syncRules.id);
127
- }
128
- else {
129
- // New (or resume after restart)
130
- try {
131
- let lock;
132
- if (configured_lock?.sync_rules_id == syncRules.id) {
133
- lock = configured_lock;
134
- }
135
- else {
136
- lock = await syncRules.lock();
137
- }
138
- const parsed = syncRules.parsed();
139
- const storage = this.storage.getInstance(parsed);
140
- const stream = new WalStreamRunner({
141
- factory: this.storage,
142
- storage: storage,
143
- source_db: this.system.config.connection,
144
- lock,
145
- rateLimiter: this.rateLimiter
146
- });
147
- newStreams.set(syncRules.id, stream);
148
- stream.start();
149
- }
150
- catch (e) {
151
- // Could be a sync rules parse error,
152
- // for example from stricter validation that was added.
153
- // This will be retried every couple of seconds.
154
- // When new (valid) sync rules are deployed and processed, this one be disabled.
155
- logger.error(`Failed to start replication for ${syncRules.slot_name}`, e);
156
- }
157
- }
158
- }
159
- this.streams = newStreams;
160
- // TODO: Should this termination be happening in the "background" instead?
161
- // That becomes tricky to manage
162
- for (let stream of existingStreams.values()) {
163
- // Old - stop and remove.
164
- try {
165
- await stream.terminate();
166
- }
167
- catch (e) {
168
- // This will be retried
169
- logger.warn(`Failed to terminate ${stream.slot_name}`, e);
170
- }
171
- }
172
- // Sync rules stopped previously or by a different process.
173
- const stopped = await this.storage.getStoppedSyncRules();
174
- for (let syncRules of stopped) {
175
- try {
176
- const lock = await syncRules.lock();
177
- try {
178
- const parsed = syncRules.parsed();
179
- const storage = this.storage.getInstance(parsed);
180
- const stream = new WalStreamRunner({
181
- factory: this.storage,
182
- storage: storage,
183
- source_db: this.system.config.connection,
184
- lock
185
- });
186
- await stream.terminate();
187
- }
188
- finally {
189
- await lock.release();
190
- }
191
- }
192
- catch (e) {
193
- logger.warn(`Failed to terminate ${syncRules.slot_name}`, e);
194
- }
195
- }
196
- }
197
- }
198
- //# sourceMappingURL=WalStreamManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WalStreamManager.js","sourceRoot":"","sources":["../../src/replication/WalStreamManager.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- import * as storage from '../storage/storage-index.js';
2
- import { ErrorRateLimiter } from './ErrorRateLimiter.js';
3
- import { ResolvedConnection } from '../util/config/types.js';
4
- export interface WalStreamRunnerOptions {
5
- factory: storage.BucketStorageFactory;
6
- storage: storage.SyncRulesBucketStorage;
7
- source_db: ResolvedConnection;
8
- lock: storage.ReplicationLock;
9
- rateLimiter?: ErrorRateLimiter;
10
- }
11
- export declare class WalStreamRunner {
12
- options: WalStreamRunnerOptions;
13
- private abortController;
14
- private runPromise?;
15
- private connections;
16
- private rateLimiter?;
17
- constructor(options: WalStreamRunnerOptions);
18
- start(): void;
19
- get slot_name(): string;
20
- get stopped(): boolean;
21
- run(): Promise<void>;
22
- replicateLoop(): Promise<void>;
23
- replicateOnce(): Promise<void>;
24
- /**
25
- * This will also release the lock if start() was called earlier.
26
- */
27
- stop(options?: {
28
- force?: boolean;
29
- }): Promise<void>;
30
- /**
31
- * Terminate this replication stream. This drops the replication slot and deletes the replication data.
32
- *
33
- * Stops replication if needed.
34
- */
35
- terminate(options?: {
36
- force?: boolean;
37
- }): Promise<void>;
38
- }
@@ -1,155 +0,0 @@
1
- import * as pgwire from '@powersync/service-jpgwire';
2
- import * as util from '../util/util-index.js';
3
- import { MissingReplicationSlotError, WalStream } from './WalStream.js';
4
- import { container, logger } from '@powersync/lib-services-framework';
5
- export class WalStreamRunner {
6
- constructor(options) {
7
- this.options = options;
8
- this.abortController = new AbortController();
9
- this.connections = null;
10
- this.rateLimiter = options.rateLimiter;
11
- }
12
- start() {
13
- this.runPromise = this.run();
14
- }
15
- get slot_name() {
16
- return this.options.storage.slot_name;
17
- }
18
- get stopped() {
19
- return this.abortController.signal.aborted;
20
- }
21
- async run() {
22
- try {
23
- await this.replicateLoop();
24
- }
25
- catch (e) {
26
- // Fatal exception
27
- container.reporter.captureException(e, {
28
- metadata: {
29
- replication_slot: this.slot_name
30
- }
31
- });
32
- logger.error(`Replication failed on ${this.slot_name}`, e);
33
- if (e instanceof MissingReplicationSlotError) {
34
- // This stops replication on this slot, and creates a new slot
35
- await this.options.storage.factory.slotRemoved(this.slot_name);
36
- }
37
- }
38
- finally {
39
- this.abortController.abort();
40
- }
41
- await this.options.lock.release();
42
- }
43
- async replicateLoop() {
44
- while (!this.stopped) {
45
- await this.replicateOnce();
46
- if (!this.stopped) {
47
- await new Promise((resolve) => setTimeout(resolve, 5000));
48
- }
49
- }
50
- }
51
- async replicateOnce() {
52
- // New connections on every iteration (every error with retry),
53
- // otherwise we risk repeating errors related to the connection,
54
- // such as caused by cached PG schemas.
55
- let connections = new util.PgManager(this.options.source_db, {
56
- // Pool connections are only used intermittently.
57
- idleTimeout: 30000,
58
- maxSize: 2
59
- });
60
- this.connections = connections;
61
- try {
62
- await this.rateLimiter?.waitUntilAllowed({ signal: this.abortController.signal });
63
- if (this.stopped) {
64
- return;
65
- }
66
- const stream = new WalStream({
67
- abort_signal: this.abortController.signal,
68
- factory: this.options.factory,
69
- storage: this.options.storage,
70
- connections
71
- });
72
- await stream.replicate();
73
- }
74
- catch (e) {
75
- logger.error(`Replication error`, e);
76
- if (e.cause != null) {
77
- // Example:
78
- // PgError.conn_ended: Unable to do postgres query on ended connection
79
- // at PgConnection.stream (file:///.../powersync/node_modules/.pnpm/github.com+kagis+pgwire@f1cb95f9a0f42a612bb5a6b67bb2eb793fc5fc87/node_modules/pgwire/mod.js:315:13)
80
- // at stream.next (<anonymous>)
81
- // at PgResult.fromStream (file:///.../powersync/node_modules/.pnpm/github.com+kagis+pgwire@f1cb95f9a0f42a612bb5a6b67bb2eb793fc5fc87/node_modules/pgwire/mod.js:1174:22)
82
- // at PgConnection.query (file:///.../powersync/node_modules/.pnpm/github.com+kagis+pgwire@f1cb95f9a0f42a612bb5a6b67bb2eb793fc5fc87/node_modules/pgwire/mod.js:311:21)
83
- // at WalStream.startInitialReplication (file:///.../powersync/powersync-service/lib/replication/WalStream.js:266:22)
84
- // ...
85
- // cause: TypeError: match is not iterable
86
- // at timestamptzToSqlite (file:///.../powersync/packages/jpgwire/dist/util.js:140:50)
87
- // at PgType.decode (file:///.../powersync/packages/jpgwire/dist/pgwire_types.js:25:24)
88
- // at PgConnection._recvDataRow (file:///.../powersync/packages/jpgwire/dist/util.js:88:22)
89
- // at PgConnection._recvMessages (file:///.../powersync/node_modules/.pnpm/github.com+kagis+pgwire@f1cb95f9a0f42a612bb5a6b67bb2eb793fc5fc87/node_modules/pgwire/mod.js:656:30)
90
- // at PgConnection._ioloopAttempt (file:///.../powersync/node_modules/.pnpm/github.com+kagis+pgwire@f1cb95f9a0f42a612bb5a6b67bb2eb793fc5fc87/node_modules/pgwire/mod.js:563:20)
91
- // at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
92
- // at async PgConnection._ioloop (file:///.../powersync/node_modules/.pnpm/github.com+kagis+pgwire@f1cb95f9a0f42a612bb5a6b67bb2eb793fc5fc87/node_modules/pgwire/mod.js:517:14),
93
- // [Symbol(pg.ErrorCode)]: 'conn_ended',
94
- // [Symbol(pg.ErrorResponse)]: undefined
95
- // }
96
- // Without this additional log, the cause would not be visible in the logs.
97
- logger.error(`cause`, e.cause);
98
- }
99
- if (e instanceof MissingReplicationSlotError) {
100
- throw e;
101
- }
102
- else {
103
- // Report the error if relevant, before retrying
104
- container.reporter.captureException(e, {
105
- metadata: {
106
- replication_slot: this.slot_name
107
- }
108
- });
109
- // This sets the retry delay
110
- this.rateLimiter?.reportError(e);
111
- }
112
- }
113
- finally {
114
- this.connections = null;
115
- if (connections != null) {
116
- await connections.end();
117
- }
118
- }
119
- }
120
- /**
121
- * This will also release the lock if start() was called earlier.
122
- */
123
- async stop(options) {
124
- logger.info(`${this.slot_name} Stopping replication`);
125
- // End gracefully
126
- this.abortController.abort();
127
- if (options?.force) {
128
- // destroy() is more forceful.
129
- await this.connections?.destroy();
130
- }
131
- await this.runPromise;
132
- }
133
- /**
134
- * Terminate this replication stream. This drops the replication slot and deletes the replication data.
135
- *
136
- * Stops replication if needed.
137
- */
138
- async terminate(options) {
139
- logger.info(`${this.slot_name} Terminating replication`);
140
- await this.stop(options);
141
- const slotName = this.slot_name;
142
- const db = await pgwire.connectPgWire(this.options.source_db, { type: 'standard' });
143
- try {
144
- await db.query({
145
- statement: 'SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name = $1',
146
- params: [{ type: 'varchar', value: slotName }]
147
- });
148
- }
149
- finally {
150
- await db.end();
151
- }
152
- await this.options.storage.terminate();
153
- }
154
- }
155
- //# sourceMappingURL=WalStreamRunner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WalStreamRunner.js","sourceRoot":"","sources":["../../src/replication/WalStreamRunner.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import * as pgwire from '@powersync/service-jpgwire';
2
- import { ReplicationColumn, ReplicationIdentity } from './PgRelation.js';
3
- export interface ReplicaIdentityResult {
4
- columns: ReplicationColumn[];
5
- replicationIdentity: ReplicationIdentity;
6
- }
7
- export declare function getPrimaryKeyColumns(db: pgwire.PgClient, relationId: number, mode: 'primary' | 'replident'): Promise<ReplicationColumn[]>;
8
- export declare function getAllColumns(db: pgwire.PgClient, relationId: number): Promise<ReplicationColumn[]>;
9
- export declare function getReplicationIdentityColumns(db: pgwire.PgClient, relationId: number): Promise<ReplicaIdentityResult>;
@@ -1,62 +0,0 @@
1
- import * as util from '../util/util-index.js';
2
- export async function getPrimaryKeyColumns(db, relationId, mode) {
3
- const indexFlag = mode == 'primary' ? `i.indisprimary` : `i.indisreplident`;
4
- const attrRows = await util.retriedQuery(db, {
5
- statement: `SELECT a.attname as name, a.atttypid as typeid, a.attnum as attnum
6
- FROM pg_index i
7
- JOIN pg_attribute a
8
- ON a.attrelid = i.indrelid
9
- AND a.attnum = ANY (i.indkey)
10
- WHERE i.indrelid = $1::oid
11
- AND ${indexFlag}
12
- AND a.attnum > 0
13
- ORDER BY a.attnum`,
14
- params: [{ value: relationId, type: 'int4' }]
15
- });
16
- return attrRows.rows.map((row) => {
17
- return { name: row[0], typeOid: row[1] };
18
- });
19
- }
20
- export async function getAllColumns(db, relationId) {
21
- const attrRows = await util.retriedQuery(db, {
22
- statement: `SELECT a.attname as name, a.atttypid as typeid, a.attnum as attnum
23
- FROM pg_attribute a
24
- WHERE a.attrelid = $1::oid
25
- AND attnum > 0
26
- ORDER BY a.attnum`,
27
- params: [{ type: 'varchar', value: relationId }]
28
- });
29
- return attrRows.rows.map((row) => {
30
- return { name: row[0], typeOid: row[1] };
31
- });
32
- }
33
- export async function getReplicationIdentityColumns(db, relationId) {
34
- const rows = await util.retriedQuery(db, {
35
- statement: `SELECT CASE relreplident
36
- WHEN 'd' THEN 'default'
37
- WHEN 'n' THEN 'nothing'
38
- WHEN 'f' THEN 'full'
39
- WHEN 'i' THEN 'index'
40
- END AS replica_identity
41
- FROM pg_class
42
- WHERE oid = $1::oid LIMIT 1`,
43
- params: [{ type: 'int8', value: relationId }]
44
- });
45
- const idType = rows.rows[0]?.[0];
46
- if (idType == 'nothing' || idType == null) {
47
- return { replicationIdentity: 'nothing', columns: [] };
48
- }
49
- else if (idType == 'full') {
50
- return { replicationIdentity: 'full', columns: await getAllColumns(db, relationId) };
51
- }
52
- else if (idType == 'default') {
53
- return { replicationIdentity: 'default', columns: await getPrimaryKeyColumns(db, relationId, 'primary') };
54
- }
55
- else if (idType == 'index') {
56
- return { replicationIdentity: 'index', columns: await getPrimaryKeyColumns(db, relationId, 'replident') };
57
- }
58
- else {
59
- return { replicationIdentity: 'nothing', columns: [] };
60
- }
61
- }
62
- //# sourceMappingURL=util.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/replication/util.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAQ9C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAmB,EACnB,UAAkB,EAClB,IAA6B;IAE7B,MAAM,SAAS,GAAG,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE;QAC3C,SAAS,EAAE;;;;;;4CAM6B,SAAS;;wDAEG;QACpD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KAC9C,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC/B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAW,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAW,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAmB,EAAE,UAAkB;IACzE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE;QAC3C,SAAS,EAAE;;;;sDAIuC;QAClD,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;KACjD,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC/B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAW,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAW,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,EAAmB,EACnB,UAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE;QACvC,SAAS,EAAE;;;;;;;4BAOa;QACxB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;KAC9C,CAAC,CAAC;IACH,MAAM,MAAM,GAAW,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,IAAI,IAAI,EAAE;QACzC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;KACxD;SAAM,IAAI,MAAM,IAAI,MAAM,EAAE;QAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC;KACtF;SAAM,IAAI,MAAM,IAAI,SAAS,EAAE;QAC9B,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;KAC3G;SAAM,IAAI,MAAM,IAAI,OAAO,EAAE;QAC5B,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;KAC3G;SAAM;QACL,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;KACxD;AACH,CAAC"}
@@ -1,23 +0,0 @@
1
- import * as pgwire from '@powersync/service-jpgwire';
2
- import { LifeCycledSystem } from '@powersync/lib-services-framework';
3
- import * as storage from '../storage/storage-index.js';
4
- import * as utils from '../util/util-index.js';
5
- export declare abstract class CorePowerSyncSystem extends LifeCycledSystem {
6
- config: utils.ResolvedPowerSyncConfig;
7
- abstract storage: storage.BucketStorageFactory;
8
- abstract pgwire_pool?: pgwire.PgClient;
9
- closed: boolean;
10
- protected stopHandlers: Set<() => void>;
11
- constructor(config: utils.ResolvedPowerSyncConfig);
12
- get client_keystore(): import("../index.js").KeyStore;
13
- get dev_client_keystore(): import("../index.js").KeyStore;
14
- /**
15
- * Adds a termination handler which will call handlers registered via
16
- * [addStopHandler].
17
- * This should be called after the server is started and it's termination handler is added.
18
- * This is so that the handler is run before the server's handler, allowing streams to be interrupted on exit
19
- */
20
- addTerminationHandler(): void;
21
- addStopHandler(handler: () => void): () => void;
22
- requirePgPool(): pgwire.PgClient;
23
- }
@@ -1,52 +0,0 @@
1
- import { LifeCycledSystem, container, logger } from '@powersync/lib-services-framework';
2
- export class CorePowerSyncSystem extends LifeCycledSystem {
3
- constructor(config) {
4
- super();
5
- this.config = config;
6
- this.stopHandlers = new Set();
7
- this.closed = false;
8
- }
9
- get client_keystore() {
10
- return this.config.client_keystore;
11
- }
12
- get dev_client_keystore() {
13
- return this.config.dev_client_keystore;
14
- }
15
- /**
16
- * Adds a termination handler which will call handlers registered via
17
- * [addStopHandler].
18
- * This should be called after the server is started and it's termination handler is added.
19
- * This is so that the handler is run before the server's handler, allowing streams to be interrupted on exit
20
- */
21
- addTerminationHandler() {
22
- container.terminationHandler.handleTerminationSignal(async () => {
23
- // Close open streams, so that they don't block the server from closing.
24
- // Note: This does not work well when streaming requests are queued. In that case, the server still doesn't
25
- // close in the 30-second timeout.
26
- this.closed = true;
27
- logger.info(`Closing ${this.stopHandlers.size} streams`);
28
- for (let handler of this.stopHandlers) {
29
- handler();
30
- }
31
- });
32
- }
33
- addStopHandler(handler) {
34
- if (this.closed) {
35
- handler();
36
- return () => { };
37
- }
38
- this.stopHandlers.add(handler);
39
- return () => {
40
- this.stopHandlers.delete(handler);
41
- };
42
- }
43
- requirePgPool() {
44
- if (this.pgwire_pool == null) {
45
- throw new Error('No source connection configured');
46
- }
47
- else {
48
- return this.pgwire_pool;
49
- }
50
- }
51
- }
52
- //# sourceMappingURL=CorePowerSyncSystem.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CorePowerSyncSystem.js","sourceRoot":"","sources":["../../src/system/CorePowerSyncSystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAKxF,MAAM,OAAgB,mBAAoB,SAAQ,gBAAgB;IAOhE,YAAmB,MAAqC;QACtD,KAAK,EAAE,CAAC;QADS,WAAM,GAAN,MAAM,CAA+B;QAF9C,iBAAY,GAAoB,IAAI,GAAG,EAAE,CAAC;QAIlD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;IACrC,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACH,qBAAqB;QACnB,SAAS,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,KAAK,IAAI,EAAE;YAC9D,wEAAwE;YACxE,2GAA2G;YAC3G,kCAAkC;YAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,CAAC;YACzD,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrC,OAAO,EAAE,CAAC;aACX;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,OAAmB;QAChC,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO,EAAE,CAAC;YACV,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;SACjB;QACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;SACpD;aAAM;YACL,OAAO,IAAI,CAAC,WAAY,CAAC;SAC1B;IACH,CAAC;CACF"}
@@ -1,24 +0,0 @@
1
- import * as pgwire from '@powersync/service-jpgwire';
2
- import { NormalizedPostgresConnection } from '@powersync/service-types';
3
- export declare class PgManager {
4
- options: NormalizedPostgresConnection;
5
- poolOptions: pgwire.PgPoolOptions;
6
- /**
7
- * Do not use this for any transactions.
8
- */
9
- readonly pool: pgwire.PgClient;
10
- private connectionPromises;
11
- constructor(options: NormalizedPostgresConnection, poolOptions: pgwire.PgPoolOptions);
12
- /**
13
- * Create a new replication connection.
14
- */
15
- replicationConnection(): Promise<pgwire.PgConnection>;
16
- /**
17
- * Create a new standard connection, used for initial snapshot.
18
- *
19
- * This connection must not be shared between multiple async contexts.
20
- */
21
- snapshotConnection(): Promise<pgwire.PgConnection>;
22
- end(): Promise<void>;
23
- destroy(): Promise<void>;
24
- }
@@ -1,55 +0,0 @@
1
- import * as pgwire from '@powersync/service-jpgwire';
2
- export class PgManager {
3
- constructor(options, poolOptions) {
4
- this.options = options;
5
- this.poolOptions = poolOptions;
6
- this.connectionPromises = [];
7
- // The pool is lazy - no connections are opened until a query is performed.
8
- this.pool = pgwire.connectPgWirePool(this.options, poolOptions);
9
- }
10
- /**
11
- * Create a new replication connection.
12
- */
13
- async replicationConnection() {
14
- const p = pgwire.connectPgWire(this.options, { type: 'replication' });
15
- this.connectionPromises.push(p);
16
- return await p;
17
- }
18
- /**
19
- * Create a new standard connection, used for initial snapshot.
20
- *
21
- * This connection must not be shared between multiple async contexts.
22
- */
23
- async snapshotConnection() {
24
- const p = pgwire.connectPgWire(this.options, { type: 'standard' });
25
- this.connectionPromises.push(p);
26
- return await p;
27
- }
28
- async end() {
29
- for (let result of await Promise.allSettled([
30
- this.pool.end(),
31
- ...this.connectionPromises.map((promise) => {
32
- return promise.then((connection) => connection.end());
33
- })
34
- ])) {
35
- // Throw the first error, if any
36
- if (result.status == 'rejected') {
37
- throw result.reason;
38
- }
39
- }
40
- }
41
- async destroy() {
42
- this.pool.destroy();
43
- for (let result of await Promise.allSettled([
44
- ...this.connectionPromises.map((promise) => {
45
- return promise.then((connection) => connection.destroy());
46
- })
47
- ])) {
48
- // Throw the first error, if any
49
- if (result.status == 'rejected') {
50
- throw result.reason;
51
- }
52
- }
53
- }
54
- }
55
- //# sourceMappingURL=PgManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PgManager.js","sourceRoot":"","sources":["../../src/util/PgManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC;AAGrD,MAAM,OAAO,SAAS;IAQpB,YAAmB,OAAqC,EAAS,WAAiC;QAA/E,YAAO,GAAP,OAAO,CAA8B;QAAS,gBAAW,GAAX,WAAW,CAAsB;QAF1F,uBAAkB,GAAmC,EAAE,CAAC;QAG9D,2EAA2E;QAC3E,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB;QACzB,MAAM,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB;QACtB,MAAM,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,KAAK,IAAI,MAAM,IAAI,MAAM,OAAO,CAAC,UAAU,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACzC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC,CAAC;SACH,CAAC,EAAE;YACF,gCAAgC;YAChC,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE;gBAC/B,MAAM,MAAM,CAAC,MAAM,CAAC;aACrB;SACF;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,IAAI,MAAM,IAAI,MAAM,OAAO,CAAC,UAAU,CAAC;YAC1C,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACzC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC;SACH,CAAC,EAAE;YACF,gCAAgC;YAChC,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE;gBAC/B,MAAM,MAAM,CAAC,MAAM,CAAC;aACrB;SACF;IACH,CAAC;CACF"}