@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.
- package/CHANGELOG.md +37 -0
- package/dist/api/RouteAPI.d.ts +67 -0
- package/dist/api/RouteAPI.js +2 -0
- package/dist/api/RouteAPI.js.map +1 -0
- package/dist/api/api-index.d.ts +1 -0
- package/dist/api/api-index.js +1 -0
- package/dist/api/api-index.js.map +1 -1
- package/dist/api/diagnostics.d.ts +4 -4
- package/dist/api/diagnostics.js +170 -158
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/api/schema.d.ts +3 -5
- package/dist/api/schema.js +14 -80
- package/dist/api/schema.js.map +1 -1
- package/dist/auth/CachedKeyCollector.js.map +1 -1
- package/dist/auth/KeySpec.js.map +1 -1
- package/dist/auth/KeyStore.d.ts +7 -4
- package/dist/auth/KeyStore.js +1 -1
- package/dist/auth/KeyStore.js.map +1 -1
- package/dist/auth/LeakyBucket.js.map +1 -1
- package/dist/auth/RemoteJWKSCollector.d.ts +0 -2
- package/dist/auth/RemoteJWKSCollector.js.map +1 -1
- package/dist/auth/auth-index.d.ts +0 -1
- package/dist/auth/auth-index.js +0 -1
- package/dist/auth/auth-index.js.map +1 -1
- package/dist/db/mongo.js +5 -3
- package/dist/db/mongo.js.map +1 -1
- package/dist/entry/cli-entry.js +3 -2
- package/dist/entry/cli-entry.js.map +1 -1
- package/dist/entry/commands/compact-action.js +90 -14
- package/dist/entry/commands/compact-action.js.map +1 -1
- package/dist/entry/commands/migrate-action.js +4 -5
- package/dist/entry/commands/migrate-action.js.map +1 -1
- package/dist/entry/commands/teardown-action.js +2 -2
- package/dist/entry/commands/teardown-action.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/locks/MongoLocks.js.map +1 -1
- package/dist/metrics/Metrics.d.ts +2 -2
- package/dist/metrics/Metrics.js +5 -13
- package/dist/metrics/Metrics.js.map +1 -1
- package/dist/migrations/db/migrations/1684951997326-init.d.ts +2 -2
- package/dist/migrations/db/migrations/1684951997326-init.js +4 -2
- package/dist/migrations/db/migrations/1684951997326-init.js.map +1 -1
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.d.ts +2 -2
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js +4 -2
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -1
- package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.d.ts +2 -2
- package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js +4 -2
- package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js.map +1 -1
- package/dist/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.d.ts +3 -0
- package/dist/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.js +31 -0
- package/dist/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.js.map +1 -0
- package/dist/migrations/executor.js.map +1 -1
- package/dist/migrations/migrations.d.ts +8 -0
- package/dist/migrations/migrations.js +19 -7
- package/dist/migrations/migrations.js.map +1 -1
- package/dist/migrations/store/migration-store.js.map +1 -1
- package/dist/modules/AbstractModule.d.ts +26 -0
- package/dist/modules/AbstractModule.js +11 -0
- package/dist/modules/AbstractModule.js.map +1 -0
- package/dist/modules/ModuleManager.d.ts +11 -0
- package/dist/modules/ModuleManager.js +32 -0
- package/dist/modules/ModuleManager.js.map +1 -0
- package/dist/modules/modules-index.d.ts +2 -0
- package/dist/modules/modules-index.js +3 -0
- package/dist/modules/modules-index.js.map +1 -0
- package/dist/replication/AbstractReplicationJob.d.ts +37 -0
- package/dist/replication/AbstractReplicationJob.js +51 -0
- package/dist/replication/AbstractReplicationJob.js.map +1 -0
- package/dist/replication/AbstractReplicator.d.ts +53 -0
- package/dist/replication/AbstractReplicator.js +250 -0
- package/dist/replication/AbstractReplicator.js.map +1 -0
- package/dist/replication/ErrorRateLimiter.d.ts +0 -10
- package/dist/replication/ErrorRateLimiter.js +1 -42
- package/dist/replication/ErrorRateLimiter.js.map +1 -1
- package/dist/replication/ReplicationEngine.d.ts +18 -0
- package/dist/replication/ReplicationEngine.js +41 -0
- package/dist/replication/ReplicationEngine.js.map +1 -0
- package/dist/replication/ReplicationModule.d.ts +51 -0
- package/dist/replication/ReplicationModule.js +68 -0
- package/dist/replication/ReplicationModule.js.map +1 -0
- package/dist/replication/replication-index.d.ts +4 -6
- package/dist/replication/replication-index.js +4 -6
- package/dist/replication/replication-index.js.map +1 -1
- package/dist/routes/RouterEngine.d.ts +42 -0
- package/dist/routes/RouterEngine.js +80 -0
- package/dist/routes/RouterEngine.js.map +1 -0
- package/dist/routes/auth.d.ts +2 -2
- package/dist/routes/auth.js +11 -11
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/configure-fastify.d.ts +37 -7
- package/dist/routes/configure-fastify.js +20 -19
- package/dist/routes/configure-fastify.js.map +1 -1
- package/dist/routes/configure-rsocket.d.ts +3 -4
- package/dist/routes/configure-rsocket.js +7 -4
- package/dist/routes/configure-rsocket.js.map +1 -1
- package/dist/routes/endpoints/admin.d.ts +30 -0
- package/dist/routes/endpoints/admin.js +46 -67
- package/dist/routes/endpoints/admin.js.map +1 -1
- package/dist/routes/endpoints/checkpointing.js +103 -15
- package/dist/routes/endpoints/checkpointing.js.map +1 -1
- package/dist/routes/endpoints/probes.d.ts +74 -0
- package/dist/routes/endpoints/probes.js +51 -0
- package/dist/routes/endpoints/probes.js.map +1 -0
- package/dist/routes/endpoints/socket-route.js +8 -6
- package/dist/routes/endpoints/socket-route.js.map +1 -1
- package/dist/routes/endpoints/sync-rules.d.ts +1 -1
- package/dist/routes/endpoints/sync-rules.js +32 -23
- package/dist/routes/endpoints/sync-rules.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.d.ts +0 -1
- package/dist/routes/endpoints/sync-stream.js +8 -8
- package/dist/routes/endpoints/sync-stream.js.map +1 -1
- package/dist/routes/hooks.js.map +1 -1
- package/dist/routes/route-register.js.map +1 -1
- package/dist/routes/router.d.ts +11 -4
- package/dist/routes/router.js.map +1 -1
- package/dist/routes/routes-index.d.ts +1 -0
- package/dist/routes/routes-index.js +1 -0
- package/dist/routes/routes-index.js.map +1 -1
- package/dist/runner/teardown.js +109 -76
- package/dist/runner/teardown.js.map +1 -1
- package/dist/storage/BucketStorage.d.ts +86 -36
- package/dist/storage/BucketStorage.js +6 -10
- package/dist/storage/BucketStorage.js.map +1 -1
- package/dist/storage/ChecksumCache.js.map +1 -1
- package/dist/storage/MongoBucketStorage.d.ts +7 -11
- package/dist/storage/MongoBucketStorage.js +48 -41
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/ReplicationEventPayload.d.ts +14 -0
- package/dist/storage/ReplicationEventPayload.js +2 -0
- package/dist/storage/ReplicationEventPayload.js.map +1 -0
- package/dist/storage/SourceEntity.d.ts +20 -0
- package/dist/storage/SourceEntity.js +2 -0
- package/dist/storage/SourceEntity.js.map +1 -0
- package/dist/storage/SourceTable.d.ts +12 -5
- package/dist/storage/SourceTable.js +12 -5
- package/dist/storage/SourceTable.js.map +1 -1
- package/dist/storage/StorageEngine.d.ts +28 -0
- package/dist/storage/StorageEngine.js +45 -0
- package/dist/storage/StorageEngine.js.map +1 -0
- package/dist/storage/StorageProvider.d.ts +21 -0
- package/dist/storage/StorageProvider.js +2 -0
- package/dist/storage/StorageProvider.js.map +1 -0
- package/dist/storage/WriteCheckpointAPI.d.ts +74 -0
- package/dist/storage/WriteCheckpointAPI.js +16 -0
- package/dist/storage/WriteCheckpointAPI.js.map +1 -0
- package/dist/storage/mongo/MongoBucketBatch.d.ts +24 -5
- package/dist/storage/mongo/MongoBucketBatch.js +119 -62
- package/dist/storage/mongo/MongoBucketBatch.js.map +1 -1
- package/dist/storage/mongo/MongoCompactor.js +20 -3
- package/dist/storage/mongo/MongoCompactor.js.map +1 -1
- package/dist/storage/mongo/MongoIdSequence.js.map +1 -1
- package/dist/storage/mongo/MongoPersistedSyncRulesContent.d.ts +2 -2
- package/dist/storage/mongo/MongoPersistedSyncRulesContent.js +2 -2
- package/dist/storage/mongo/MongoPersistedSyncRulesContent.js.map +1 -1
- package/dist/storage/mongo/MongoStorageProvider.d.ts +5 -0
- package/dist/storage/mongo/MongoStorageProvider.js +26 -0
- package/dist/storage/mongo/MongoStorageProvider.js.map +1 -0
- package/dist/storage/mongo/MongoSyncBucketStorage.d.ts +18 -10
- package/dist/storage/mongo/MongoSyncBucketStorage.js +140 -25
- package/dist/storage/mongo/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/mongo/MongoSyncRulesLock.js +1 -1
- package/dist/storage/mongo/MongoSyncRulesLock.js.map +1 -1
- package/dist/storage/mongo/MongoWriteCheckpointAPI.d.ts +20 -0
- package/dist/storage/mongo/MongoWriteCheckpointAPI.js +103 -0
- package/dist/storage/mongo/MongoWriteCheckpointAPI.js.map +1 -0
- package/dist/storage/mongo/OperationBatch.d.ts +13 -4
- package/dist/storage/mongo/OperationBatch.js +25 -7
- package/dist/storage/mongo/OperationBatch.js.map +1 -1
- package/dist/storage/mongo/PersistedBatch.d.ts +3 -3
- package/dist/storage/mongo/PersistedBatch.js +2 -2
- package/dist/storage/mongo/PersistedBatch.js.map +1 -1
- package/dist/storage/mongo/config.d.ts +19 -0
- package/dist/storage/mongo/config.js +26 -0
- package/dist/storage/mongo/config.js.map +1 -0
- package/dist/storage/mongo/db.d.ts +3 -2
- package/dist/storage/mongo/db.js +1 -0
- package/dist/storage/mongo/db.js.map +1 -1
- package/dist/storage/mongo/models.d.ts +20 -5
- package/dist/storage/mongo/models.js.map +1 -1
- package/dist/storage/mongo/util.d.ts +12 -1
- package/dist/storage/mongo/util.js +50 -2
- package/dist/storage/mongo/util.js.map +1 -1
- package/dist/storage/storage-index.d.ts +8 -2
- package/dist/storage/storage-index.js +8 -2
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/sync/BroadcastIterable.d.ts +0 -1
- package/dist/sync/BroadcastIterable.js.map +1 -1
- package/dist/sync/LastValueSink.d.ts +0 -1
- package/dist/sync/LastValueSink.js.map +1 -1
- package/dist/sync/merge.d.ts +0 -1
- package/dist/sync/merge.js.map +1 -1
- package/dist/sync/safeRace.js.map +1 -1
- package/dist/sync/sync.d.ts +1 -1
- package/dist/sync/sync.js +5 -5
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.d.ts +0 -2
- package/dist/sync/util.js.map +1 -1
- package/dist/system/ServiceContext.d.ts +37 -0
- package/dist/system/ServiceContext.js +48 -0
- package/dist/system/ServiceContext.js.map +1 -0
- package/dist/system/system-index.d.ts +1 -1
- package/dist/system/system-index.js +1 -1
- package/dist/system/system-index.js.map +1 -1
- package/dist/util/Mutex.js.map +1 -1
- package/dist/util/config/collectors/config-collector.js.map +1 -1
- package/dist/util/config/collectors/impl/base64-config-collector.js.map +1 -1
- package/dist/util/config/collectors/impl/filesystem-config-collector.js.map +1 -1
- package/dist/util/config/compound-config-collector.d.ts +9 -2
- package/dist/util/config/compound-config-collector.js +16 -24
- package/dist/util/config/compound-config-collector.js.map +1 -1
- package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js.map +1 -1
- package/dist/util/config/sync-rules/sync-rules-provider.d.ts +9 -0
- package/dist/util/config/sync-rules/sync-rules-provider.js +15 -0
- package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -0
- package/dist/util/config/types.d.ts +7 -4
- package/dist/util/config/types.js.map +1 -1
- package/dist/util/config.d.ts +3 -4
- package/dist/util/config.js +5 -20
- package/dist/util/config.js.map +1 -1
- package/dist/util/memory-tracking.js.map +1 -1
- package/dist/util/secs.js.map +1 -1
- package/dist/util/util-index.d.ts +3 -6
- package/dist/util/util-index.js +3 -6
- package/dist/util/util-index.js.map +1 -1
- package/dist/util/utils.d.ts +10 -7
- package/dist/util/utils.js +36 -25
- package/dist/util/utils.js.map +1 -1
- package/package.json +8 -12
- package/src/api/RouteAPI.ts +78 -0
- package/src/api/api-index.ts +1 -0
- package/src/api/diagnostics.ts +18 -70
- package/src/api/schema.ts +18 -90
- package/src/auth/KeyStore.ts +9 -6
- package/src/auth/RemoteJWKSCollector.ts +4 -1
- package/src/auth/auth-index.ts +0 -1
- package/src/db/mongo.ts +5 -3
- package/src/entry/cli-entry.ts +3 -2
- package/src/entry/commands/compact-action.ts +24 -12
- package/src/entry/commands/migrate-action.ts +5 -8
- package/src/entry/commands/teardown-action.ts +2 -2
- package/src/index.ts +5 -2
- package/src/metrics/Metrics.ts +6 -16
- package/src/migrations/db/migrations/1684951997326-init.ts +9 -4
- package/src/migrations/db/migrations/1702295701188-sync-rule-state.ts +7 -4
- package/src/migrations/db/migrations/1711543888062-write-checkpoint-index.ts +6 -4
- package/src/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.ts +37 -0
- package/src/migrations/migrations.ts +24 -8
- package/src/modules/AbstractModule.ts +37 -0
- package/src/modules/ModuleManager.ts +34 -0
- package/src/modules/modules-index.ts +2 -0
- package/src/replication/AbstractReplicationJob.ts +79 -0
- package/src/replication/AbstractReplicator.ts +228 -0
- package/src/replication/ErrorRateLimiter.ts +0 -44
- package/src/replication/ReplicationEngine.ts +43 -0
- package/src/replication/ReplicationModule.ts +122 -0
- package/src/replication/replication-index.ts +4 -6
- package/src/routes/RouterEngine.ts +120 -0
- package/src/routes/auth.ts +21 -12
- package/src/routes/configure-fastify.ts +28 -28
- package/src/routes/configure-rsocket.ts +13 -8
- package/src/routes/endpoints/admin.ts +72 -76
- package/src/routes/endpoints/checkpointing.ts +51 -11
- package/src/routes/endpoints/probes.ts +58 -0
- package/src/routes/endpoints/socket-route.ts +10 -6
- package/src/routes/endpoints/sync-rules.ts +41 -25
- package/src/routes/endpoints/sync-stream.ts +8 -8
- package/src/routes/router.ts +10 -5
- package/src/routes/routes-index.ts +1 -0
- package/src/runner/teardown.ts +50 -88
- package/src/storage/BucketStorage.ts +103 -41
- package/src/storage/MongoBucketStorage.ts +65 -53
- package/src/storage/ReplicationEventPayload.ts +16 -0
- package/src/storage/SourceEntity.ts +22 -0
- package/src/storage/SourceTable.ts +14 -7
- package/src/storage/StorageEngine.ts +62 -0
- package/src/storage/StorageProvider.ts +27 -0
- package/src/storage/WriteCheckpointAPI.ts +85 -0
- package/src/storage/mongo/MongoBucketBatch.ts +164 -84
- package/src/storage/mongo/MongoCompactor.ts +25 -4
- package/src/storage/mongo/MongoPersistedSyncRulesContent.ts +7 -4
- package/src/storage/mongo/MongoStorageProvider.ts +31 -0
- package/src/storage/mongo/MongoSyncBucketStorage.ts +118 -41
- package/src/storage/mongo/MongoSyncRulesLock.ts +7 -3
- package/src/storage/mongo/MongoWriteCheckpointAPI.ts +151 -0
- package/src/storage/mongo/OperationBatch.ts +28 -12
- package/src/storage/mongo/PersistedBatch.ts +10 -6
- package/src/storage/mongo/config.ts +40 -0
- package/src/storage/mongo/db.ts +4 -1
- package/src/storage/mongo/models.ts +21 -5
- package/src/storage/mongo/util.ts +48 -3
- package/src/storage/storage-index.ts +8 -2
- package/src/sync/sync.ts +7 -4
- package/src/sync/util.ts +0 -1
- package/src/system/ServiceContext.ts +68 -0
- package/src/system/system-index.ts +1 -1
- package/src/util/config/compound-config-collector.ts +31 -31
- package/src/util/config/sync-rules/sync-rules-provider.ts +18 -0
- package/src/util/config/types.ts +7 -5
- package/src/util/config.ts +6 -23
- package/src/util/util-index.ts +3 -6
- package/src/util/utils.ts +48 -41
- package/test/src/__snapshots__/sync.test.ts.snap +14 -14
- package/test/src/auth.test.ts +7 -7
- package/test/src/broadcast_iterable.test.ts +1 -1
- package/test/src/compacting.test.ts +50 -40
- package/test/src/data_storage.test.ts +382 -202
- package/test/src/env.ts +1 -3
- package/test/src/merge_iterable.test.ts +1 -6
- package/test/src/routes/probes.integration.test.ts +235 -0
- package/test/src/routes/probes.test.ts +153 -0
- package/test/src/setup.ts +1 -1
- package/test/src/stream_utils.ts +42 -0
- package/test/src/sync.test.ts +115 -39
- package/test/src/util.ts +48 -51
- package/test/tsconfig.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +7 -1
- package/dist/auth/SupabaseKeyCollector.d.ts +0 -22
- package/dist/auth/SupabaseKeyCollector.js +0 -61
- package/dist/auth/SupabaseKeyCollector.js.map +0 -1
- package/dist/replication/PgRelation.d.ts +0 -16
- package/dist/replication/PgRelation.js +0 -26
- package/dist/replication/PgRelation.js.map +0 -1
- package/dist/replication/WalConnection.d.ts +0 -34
- package/dist/replication/WalConnection.js +0 -190
- package/dist/replication/WalConnection.js.map +0 -1
- package/dist/replication/WalStream.d.ts +0 -57
- package/dist/replication/WalStream.js +0 -519
- package/dist/replication/WalStream.js.map +0 -1
- package/dist/replication/WalStreamManager.d.ts +0 -30
- package/dist/replication/WalStreamManager.js +0 -198
- package/dist/replication/WalStreamManager.js.map +0 -1
- package/dist/replication/WalStreamRunner.d.ts +0 -38
- package/dist/replication/WalStreamRunner.js +0 -155
- package/dist/replication/WalStreamRunner.js.map +0 -1
- package/dist/replication/util.d.ts +0 -9
- package/dist/replication/util.js +0 -62
- package/dist/replication/util.js.map +0 -1
- package/dist/system/CorePowerSyncSystem.d.ts +0 -23
- package/dist/system/CorePowerSyncSystem.js +0 -52
- package/dist/system/CorePowerSyncSystem.js.map +0 -1
- package/dist/util/PgManager.d.ts +0 -24
- package/dist/util/PgManager.js +0 -55
- package/dist/util/PgManager.js.map +0 -1
- package/dist/util/migration_lib.d.ts +0 -11
- package/dist/util/migration_lib.js +0 -64
- package/dist/util/migration_lib.js.map +0 -1
- package/dist/util/pgwire_utils.d.ts +0 -24
- package/dist/util/pgwire_utils.js +0 -117
- package/dist/util/pgwire_utils.js.map +0 -1
- package/dist/util/populate_test_data.d.ts +0 -8
- package/dist/util/populate_test_data.js +0 -65
- package/dist/util/populate_test_data.js.map +0 -1
- package/src/auth/SupabaseKeyCollector.ts +0 -67
- package/src/replication/PgRelation.ts +0 -42
- package/src/replication/WalConnection.ts +0 -227
- package/src/replication/WalStream.ts +0 -631
- package/src/replication/WalStreamManager.ts +0 -213
- package/src/replication/WalStreamRunner.ts +0 -180
- package/src/replication/util.ts +0 -76
- package/src/system/CorePowerSyncSystem.ts +0 -64
- package/src/util/PgManager.ts +0 -64
- package/src/util/migration_lib.ts +0 -79
- package/src/util/pgwire_utils.ts +0 -139
- package/src/util/populate_test_data.ts +0 -78
- package/test/src/__snapshots__/pg_test.test.ts.snap +0 -256
- package/test/src/large_batch.test.ts +0 -194
- package/test/src/pg_test.test.ts +0 -450
- package/test/src/schema_changes.test.ts +0 -545
- package/test/src/slow_tests.test.ts +0 -338
- package/test/src/validation.test.ts +0 -63
- package/test/src/wal_stream.test.ts +0 -319
- package/test/src/wal_stream_utils.ts +0 -156
package/vitest.config.ts
CHANGED
|
@@ -4,6 +4,12 @@ import tsconfigPaths from 'vite-tsconfig-paths';
|
|
|
4
4
|
export default defineConfig({
|
|
5
5
|
plugins: [tsconfigPaths()],
|
|
6
6
|
test: {
|
|
7
|
-
setupFiles: './test/src/setup.ts'
|
|
7
|
+
setupFiles: './test/src/setup.ts',
|
|
8
|
+
poolOptions: {
|
|
9
|
+
threads: {
|
|
10
|
+
singleThread: true
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
pool: 'threads'
|
|
8
14
|
}
|
|
9
15
|
});
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import * as jose from 'jose';
|
|
2
|
-
import { KeyCollector } from './KeyCollector.js';
|
|
3
|
-
import { KeySpec } from './KeySpec.js';
|
|
4
|
-
import { ResolvedConnection } from '../util/config/types.js';
|
|
5
|
-
/**
|
|
6
|
-
* Fetches key from the Supabase database.
|
|
7
|
-
*
|
|
8
|
-
* Unfortunately, despite the JWTs containing a kid, we have no way to lookup that kid
|
|
9
|
-
* before receiving a valid token.
|
|
10
|
-
*/
|
|
11
|
-
export declare class SupabaseKeyCollector implements KeyCollector {
|
|
12
|
-
private pool;
|
|
13
|
-
private keyOptions;
|
|
14
|
-
constructor(connection: ResolvedConnection);
|
|
15
|
-
getKeys(): Promise<{
|
|
16
|
-
keys: never[];
|
|
17
|
-
errors: jose.errors.JWKSNoMatchingKey[];
|
|
18
|
-
} | {
|
|
19
|
-
keys: KeySpec[];
|
|
20
|
-
errors: never[];
|
|
21
|
-
}>;
|
|
22
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import * as jose from 'jose';
|
|
2
|
-
import { connectPgWirePool, pgwireRows } from '@powersync/service-jpgwire';
|
|
3
|
-
import { KeySpec } from './KeySpec.js';
|
|
4
|
-
import { retriedQuery } from '../util/pgwire_utils.js';
|
|
5
|
-
/**
|
|
6
|
-
* Fetches key from the Supabase database.
|
|
7
|
-
*
|
|
8
|
-
* Unfortunately, despite the JWTs containing a kid, we have no way to lookup that kid
|
|
9
|
-
* before receiving a valid token.
|
|
10
|
-
*/
|
|
11
|
-
export class SupabaseKeyCollector {
|
|
12
|
-
constructor(connection) {
|
|
13
|
-
this.keyOptions = {
|
|
14
|
-
requiresAudience: ['authenticated'],
|
|
15
|
-
maxLifetimeSeconds: 86400 * 7 + 1200 // 1 week + 20 minutes margin
|
|
16
|
-
};
|
|
17
|
-
this.pool = connectPgWirePool(connection, {
|
|
18
|
-
// To avoid overloading the source database with open connections,
|
|
19
|
-
// limit to a single connection, and close the connection shortly
|
|
20
|
-
// after using it.
|
|
21
|
-
idleTimeout: 5000,
|
|
22
|
-
maxSize: 1
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
async getKeys() {
|
|
26
|
-
let row;
|
|
27
|
-
try {
|
|
28
|
-
const rows = pgwireRows(await retriedQuery(this.pool, `SELECT current_setting('app.settings.jwt_secret') as jwt_secret`));
|
|
29
|
-
row = rows[0];
|
|
30
|
-
}
|
|
31
|
-
catch (e) {
|
|
32
|
-
if (e.message?.includes('unrecognized configuration parameter')) {
|
|
33
|
-
throw new jose.errors.JOSEError(`Generate a new JWT secret on Supabase. Cause: ${e.message}`);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
throw e;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
const secret = row?.jwt_secret;
|
|
40
|
-
if (secret == null) {
|
|
41
|
-
return {
|
|
42
|
-
keys: [],
|
|
43
|
-
errors: [new jose.errors.JWKSNoMatchingKey()]
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
const key = {
|
|
48
|
-
kty: 'oct',
|
|
49
|
-
alg: 'HS256',
|
|
50
|
-
// While the secret is valid base64, the base64-encoded form is the secret value.
|
|
51
|
-
k: Buffer.from(secret, 'utf8').toString('base64url')
|
|
52
|
-
};
|
|
53
|
-
const imported = await KeySpec.importKey(key, this.keyOptions);
|
|
54
|
-
return {
|
|
55
|
-
keys: [imported],
|
|
56
|
-
errors: []
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=SupabaseKeyCollector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SupabaseKeyCollector.js","sourceRoot":"","sources":["../../src/auth/SupabaseKeyCollector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IAQ/B,YAAY,UAA8B;QALlC,eAAU,GAAe;YAC/B,gBAAgB,EAAE,CAAC,eAAe,CAAC;YACnC,kBAAkB,EAAE,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,6BAA6B;SACnE,CAAC;QAGA,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,UAAU,EAAE;YACxC,kEAAkE;YAClE,iEAAiE;YACjE,kBAAkB;YAClB,WAAW,EAAE,IAAK;YAClB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,GAA2B,CAAC;QAChC,IAAI;YACF,MAAM,IAAI,GAAG,UAAU,CACrB,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,iEAAiE,CAAC,CACjG,CAAC;YACF,GAAG,GAAG,IAAI,CAAC,CAAC,CAAQ,CAAC;SACtB;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,sCAAsC,CAAC,EAAE;gBAC/D,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aAC/F;iBAAM;gBACL,MAAM,CAAC,CAAC;aACT;SACF;QACD,MAAM,MAAM,GAAG,GAAG,EAAE,UAAgC,CAAC;QACrD,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,OAAO;gBACL,IAAI,EAAE,EAAE;gBACR,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;aAC9C,CAAC;SACH;aAAM;YACL,MAAM,GAAG,GAAa;gBACpB,GAAG,EAAE,KAAK;gBACV,GAAG,EAAE,OAAO;gBACZ,iFAAiF;gBACjF,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;aACrD,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,OAAO;gBACL,IAAI,EAAE,CAAC,QAAQ,CAAC;gBAChB,MAAM,EAAE,EAAE;aACX,CAAC;SACH;IACH,CAAC;CACF"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { PgoutputRelation } from '@powersync/service-jpgwire';
|
|
2
|
-
export interface PgRelation {
|
|
3
|
-
readonly relationId: number;
|
|
4
|
-
readonly schema: string;
|
|
5
|
-
readonly name: string;
|
|
6
|
-
readonly replicaIdentity: ReplicationIdentity;
|
|
7
|
-
readonly replicationColumns: ReplicationColumn[];
|
|
8
|
-
}
|
|
9
|
-
export type ReplicationIdentity = 'default' | 'nothing' | 'full' | 'index';
|
|
10
|
-
export interface ReplicationColumn {
|
|
11
|
-
readonly name: string;
|
|
12
|
-
readonly typeOid: number;
|
|
13
|
-
}
|
|
14
|
-
export declare function getReplicaIdColumns(relation: PgoutputRelation): ReplicationColumn[];
|
|
15
|
-
export declare function getRelId(source: PgoutputRelation): number;
|
|
16
|
-
export declare function getPgOutputRelation(source: PgoutputRelation): PgRelation;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export function getReplicaIdColumns(relation) {
|
|
2
|
-
if (relation.replicaIdentity == 'nothing') {
|
|
3
|
-
return [];
|
|
4
|
-
}
|
|
5
|
-
else {
|
|
6
|
-
return relation.columns.filter((c) => (c.flags & 0b1) != 0).map((c) => ({ name: c.name, typeOid: c.typeOid }));
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
export function getRelId(source) {
|
|
10
|
-
// Source types are wrong here
|
|
11
|
-
const relId = source.relationOid;
|
|
12
|
-
if (relId == null || typeof relId != 'number') {
|
|
13
|
-
throw new Error(`No relation id!`);
|
|
14
|
-
}
|
|
15
|
-
return relId;
|
|
16
|
-
}
|
|
17
|
-
export function getPgOutputRelation(source) {
|
|
18
|
-
return {
|
|
19
|
-
name: source.name,
|
|
20
|
-
schema: source.schema,
|
|
21
|
-
relationId: getRelId(source),
|
|
22
|
-
replicaIdentity: source.replicaIdentity,
|
|
23
|
-
replicationColumns: getReplicaIdColumns(source)
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=PgRelation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PgRelation.js","sourceRoot":"","sources":["../../src/replication/PgRelation.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,mBAAmB,CAAC,QAA0B;IAC5D,IAAI,QAAQ,CAAC,eAAe,IAAI,SAAS,EAAE;QACzC,OAAO,EAAE,CAAC;KACX;SAAM;QACL,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;KAChH;AACH,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,MAAwB;IAC/C,8BAA8B;IAC9B,MAAM,KAAK,GAAI,MAAc,CAAC,WAAqB,CAAC;IACpD,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE;QAC7C,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;KACpC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC1D,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC;QAC5B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,kBAAkB,EAAE,mBAAmB,CAAC,MAAM,CAAC;KAChD,CAAC;AACJ,CAAC"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import * as pgwire from '@powersync/service-jpgwire';
|
|
2
|
-
import { SqlSyncRules, TablePattern } from '@powersync/service-sync-rules';
|
|
3
|
-
import { TableInfo } from '@powersync/service-types';
|
|
4
|
-
/**
|
|
5
|
-
* Connection that _manages_ WAL, but does not do streaming.
|
|
6
|
-
*/
|
|
7
|
-
export declare class WalConnection {
|
|
8
|
-
db: pgwire.PgClient;
|
|
9
|
-
connectionTag: string;
|
|
10
|
-
publication_name: string;
|
|
11
|
-
sync_rules: SqlSyncRules;
|
|
12
|
-
/**
|
|
13
|
-
* db can be a PgConnection or PgPool.
|
|
14
|
-
*
|
|
15
|
-
* No transactions are used here, but it is up to the client to ensure
|
|
16
|
-
* nothing here is called in the middle of another transaction if
|
|
17
|
-
* PgConnection is used.
|
|
18
|
-
*/
|
|
19
|
-
constructor(options: {
|
|
20
|
-
db: pgwire.PgClient;
|
|
21
|
-
sync_rules: SqlSyncRules;
|
|
22
|
-
});
|
|
23
|
-
checkSourceConfiguration(): Promise<void>;
|
|
24
|
-
getDebugTableInfo(tablePattern: TablePattern, name: string, relationId: number | null): Promise<TableInfo>;
|
|
25
|
-
getDebugTablesInfo(tablePatterns: TablePattern[]): Promise<PatternResult[]>;
|
|
26
|
-
}
|
|
27
|
-
export interface PatternResult {
|
|
28
|
-
schema: string;
|
|
29
|
-
pattern: string;
|
|
30
|
-
wildcard: boolean;
|
|
31
|
-
tables?: TableInfo[];
|
|
32
|
-
table?: TableInfo;
|
|
33
|
-
}
|
|
34
|
-
export declare function checkSourceConfiguration(db: pgwire.PgClient): Promise<void>;
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { pgwireRows } from '@powersync/service-jpgwire';
|
|
2
|
-
import { DEFAULT_TAG } from '@powersync/service-sync-rules';
|
|
3
|
-
import * as storage from '../storage/storage-index.js';
|
|
4
|
-
import * as util from '../util/util-index.js';
|
|
5
|
-
import { getReplicationIdentityColumns } from './util.js';
|
|
6
|
-
/**
|
|
7
|
-
* Connection that _manages_ WAL, but does not do streaming.
|
|
8
|
-
*/
|
|
9
|
-
export class WalConnection {
|
|
10
|
-
/**
|
|
11
|
-
* db can be a PgConnection or PgPool.
|
|
12
|
-
*
|
|
13
|
-
* No transactions are used here, but it is up to the client to ensure
|
|
14
|
-
* nothing here is called in the middle of another transaction if
|
|
15
|
-
* PgConnection is used.
|
|
16
|
-
*/
|
|
17
|
-
constructor(options) {
|
|
18
|
-
this.connectionTag = DEFAULT_TAG;
|
|
19
|
-
this.publication_name = 'powersync';
|
|
20
|
-
this.db = options.db;
|
|
21
|
-
this.sync_rules = options.sync_rules;
|
|
22
|
-
}
|
|
23
|
-
async checkSourceConfiguration() {
|
|
24
|
-
await checkSourceConfiguration(this.db);
|
|
25
|
-
}
|
|
26
|
-
async getDebugTableInfo(tablePattern, name, relationId) {
|
|
27
|
-
const schema = tablePattern.schema;
|
|
28
|
-
let id_columns_result = undefined;
|
|
29
|
-
let id_columns_error = null;
|
|
30
|
-
if (relationId != null) {
|
|
31
|
-
try {
|
|
32
|
-
id_columns_result = await getReplicationIdentityColumns(this.db, relationId);
|
|
33
|
-
}
|
|
34
|
-
catch (e) {
|
|
35
|
-
id_columns_error = { level: 'fatal', message: e.message };
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
const id_columns = id_columns_result?.columns ?? [];
|
|
39
|
-
const sourceTable = new storage.SourceTable(0, this.connectionTag, relationId ?? 0, schema, name, id_columns, true);
|
|
40
|
-
const syncData = this.sync_rules.tableSyncsData(sourceTable);
|
|
41
|
-
const syncParameters = this.sync_rules.tableSyncsParameters(sourceTable);
|
|
42
|
-
if (relationId == null) {
|
|
43
|
-
return {
|
|
44
|
-
schema: schema,
|
|
45
|
-
name: name,
|
|
46
|
-
pattern: tablePattern.isWildcard ? tablePattern.tablePattern : undefined,
|
|
47
|
-
replication_id: [],
|
|
48
|
-
data_queries: syncData,
|
|
49
|
-
parameter_queries: syncParameters,
|
|
50
|
-
// Also
|
|
51
|
-
errors: [{ level: 'warning', message: `Table ${sourceTable.qualifiedName} not found.` }]
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
if (id_columns.length == 0 && id_columns_error == null) {
|
|
55
|
-
let message = `No replication id found for ${sourceTable.qualifiedName}. Replica identity: ${id_columns_result?.replicationIdentity}.`;
|
|
56
|
-
if (id_columns_result?.replicationIdentity == 'default') {
|
|
57
|
-
message += ' Configure a primary key on the table.';
|
|
58
|
-
}
|
|
59
|
-
id_columns_error = { level: 'fatal', message };
|
|
60
|
-
}
|
|
61
|
-
let selectError = null;
|
|
62
|
-
try {
|
|
63
|
-
await util.retriedQuery(this.db, `SELECT * FROM ${sourceTable.escapedIdentifier} LIMIT 1`);
|
|
64
|
-
}
|
|
65
|
-
catch (e) {
|
|
66
|
-
selectError = { level: 'fatal', message: e.message };
|
|
67
|
-
}
|
|
68
|
-
let replicateError = null;
|
|
69
|
-
const publications = await util.retriedQuery(this.db, {
|
|
70
|
-
statement: `SELECT tablename FROM pg_publication_tables WHERE pubname = $1 AND schemaname = $2 AND tablename = $3`,
|
|
71
|
-
params: [
|
|
72
|
-
{ type: 'varchar', value: this.publication_name },
|
|
73
|
-
{ type: 'varchar', value: tablePattern.schema },
|
|
74
|
-
{ type: 'varchar', value: name }
|
|
75
|
-
]
|
|
76
|
-
});
|
|
77
|
-
if (publications.rows.length == 0) {
|
|
78
|
-
replicateError = {
|
|
79
|
-
level: 'fatal',
|
|
80
|
-
message: `Table ${sourceTable.qualifiedName} is not part of publication '${this.publication_name}'. Run: \`ALTER PUBLICATION ${this.publication_name} ADD TABLE ${sourceTable.qualifiedName}\`.`
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
return {
|
|
84
|
-
schema: schema,
|
|
85
|
-
name: name,
|
|
86
|
-
pattern: tablePattern.isWildcard ? tablePattern.tablePattern : undefined,
|
|
87
|
-
replication_id: id_columns.map((c) => c.name),
|
|
88
|
-
data_queries: syncData,
|
|
89
|
-
parameter_queries: syncParameters,
|
|
90
|
-
errors: [id_columns_error, selectError, replicateError].filter((error) => error != null)
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
async getDebugTablesInfo(tablePatterns) {
|
|
94
|
-
let result = [];
|
|
95
|
-
for (let tablePattern of tablePatterns) {
|
|
96
|
-
const schema = tablePattern.schema;
|
|
97
|
-
let patternResult = {
|
|
98
|
-
schema: schema,
|
|
99
|
-
pattern: tablePattern.tablePattern,
|
|
100
|
-
wildcard: tablePattern.isWildcard
|
|
101
|
-
};
|
|
102
|
-
result.push(patternResult);
|
|
103
|
-
if (tablePattern.isWildcard) {
|
|
104
|
-
patternResult.tables = [];
|
|
105
|
-
const prefix = tablePattern.tablePrefix;
|
|
106
|
-
const results = await util.retriedQuery(this.db, {
|
|
107
|
-
statement: `SELECT c.oid AS relid, c.relname AS table_name
|
|
108
|
-
FROM pg_class c
|
|
109
|
-
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
110
|
-
WHERE n.nspname = $1
|
|
111
|
-
AND c.relkind = 'r'
|
|
112
|
-
AND c.relname LIKE $2`,
|
|
113
|
-
params: [
|
|
114
|
-
{ type: 'varchar', value: schema },
|
|
115
|
-
{ type: 'varchar', value: tablePattern.tablePattern }
|
|
116
|
-
]
|
|
117
|
-
});
|
|
118
|
-
for (let row of pgwireRows(results)) {
|
|
119
|
-
const name = row.table_name;
|
|
120
|
-
const relationId = row.relid;
|
|
121
|
-
if (!name.startsWith(prefix)) {
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
const details = await this.getDebugTableInfo(tablePattern, name, relationId);
|
|
125
|
-
patternResult.tables.push(details);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
const results = await util.retriedQuery(this.db, {
|
|
130
|
-
statement: `SELECT c.oid AS relid, c.relname AS table_name
|
|
131
|
-
FROM pg_class c
|
|
132
|
-
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
133
|
-
WHERE n.nspname = $1
|
|
134
|
-
AND c.relkind = 'r'
|
|
135
|
-
AND c.relname = $2`,
|
|
136
|
-
params: [
|
|
137
|
-
{ type: 'varchar', value: schema },
|
|
138
|
-
{ type: 'varchar', value: tablePattern.tablePattern }
|
|
139
|
-
]
|
|
140
|
-
});
|
|
141
|
-
if (results.rows.length == 0) {
|
|
142
|
-
// Table not found
|
|
143
|
-
const details = await this.getDebugTableInfo(tablePattern, tablePattern.name, null);
|
|
144
|
-
patternResult.table = details;
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
const row = pgwireRows(results)[0];
|
|
148
|
-
const name = row.table_name;
|
|
149
|
-
const relationId = row.relid;
|
|
150
|
-
patternResult.table = await this.getDebugTableInfo(tablePattern, name, relationId);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return result;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
export async function checkSourceConfiguration(db) {
|
|
158
|
-
// TODO: configurable
|
|
159
|
-
const publication_name = 'powersync';
|
|
160
|
-
// Check basic config
|
|
161
|
-
await util.retriedQuery(db, `DO $$
|
|
162
|
-
BEGIN
|
|
163
|
-
if current_setting('wal_level') is distinct from 'logical' then
|
|
164
|
-
raise exception 'wal_level must be set to ''logical'', your database has it set to ''%''. Please edit your config file and restart PostgreSQL.', current_setting('wal_level');
|
|
165
|
-
end if;
|
|
166
|
-
if (current_setting('max_replication_slots')::int >= 1) is not true then
|
|
167
|
-
raise exception 'Your max_replication_slots setting is too low, it must be greater than 1. Please edit your config file and restart PostgreSQL.';
|
|
168
|
-
end if;
|
|
169
|
-
if (current_setting('max_wal_senders')::int >= 1) is not true then
|
|
170
|
-
raise exception 'Your max_wal_senders setting is too low, it must be greater than 1. Please edit your config file and restart PostgreSQL.';
|
|
171
|
-
end if;
|
|
172
|
-
end;
|
|
173
|
-
$$ LANGUAGE plpgsql;`);
|
|
174
|
-
// Check that publication exists
|
|
175
|
-
const rs = await util.retriedQuery(db, {
|
|
176
|
-
statement: `SELECT * FROM pg_publication WHERE pubname = $1`,
|
|
177
|
-
params: [{ type: 'varchar', value: publication_name }]
|
|
178
|
-
});
|
|
179
|
-
const row = pgwireRows(rs)[0];
|
|
180
|
-
if (row == null) {
|
|
181
|
-
throw new Error(`Publication '${publication_name}' does not exist. Run: \`CREATE PUBLICATION ${publication_name} FOR ALL TABLES\`, or read the documentation for details.`);
|
|
182
|
-
}
|
|
183
|
-
if (row.pubinsert == false || row.pubupdate == false || row.pubdelete == false || row.pubtruncate == false) {
|
|
184
|
-
throw new Error(`Publication '${publication_name}' does not publish all changes. Create a publication using \`WITH (publish = "insert, update, delete, truncate")\` (the default).`);
|
|
185
|
-
}
|
|
186
|
-
if (row.pubviaroot) {
|
|
187
|
-
throw new Error(`'${publication_name}' uses publish_via_partition_root, which is not supported.`);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
//# sourceMappingURL=WalConnection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WalConnection.js","sourceRoot":"","sources":["../../src/replication/WalConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import * as pgwire from '@powersync/service-jpgwire';
|
|
3
|
-
import { SqliteRow, SqlSyncRules, TablePattern } from '@powersync/service-sync-rules';
|
|
4
|
-
import * as storage from '../storage/storage-index.js';
|
|
5
|
-
import * as util from '../util/util-index.js';
|
|
6
|
-
import { PgRelation } from './PgRelation.js';
|
|
7
|
-
import { WalConnection } from './WalConnection.js';
|
|
8
|
-
export declare const ZERO_LSN = "00000000/00000000";
|
|
9
|
-
export interface WalStreamOptions {
|
|
10
|
-
connections: util.PgManager;
|
|
11
|
-
factory: storage.BucketStorageFactory;
|
|
12
|
-
storage: storage.SyncRulesBucketStorage;
|
|
13
|
-
abort_signal: AbortSignal;
|
|
14
|
-
}
|
|
15
|
-
interface InitResult {
|
|
16
|
-
needsInitialSync: boolean;
|
|
17
|
-
}
|
|
18
|
-
export declare class MissingReplicationSlotError extends Error {
|
|
19
|
-
constructor(message: string);
|
|
20
|
-
}
|
|
21
|
-
export declare class WalStream {
|
|
22
|
-
sync_rules: SqlSyncRules;
|
|
23
|
-
group_id: number;
|
|
24
|
-
wal_connection: WalConnection;
|
|
25
|
-
connection_id: number;
|
|
26
|
-
private readonly storage;
|
|
27
|
-
private slot_name;
|
|
28
|
-
private connections;
|
|
29
|
-
private abort_signal;
|
|
30
|
-
private relation_cache;
|
|
31
|
-
private startedStreaming;
|
|
32
|
-
constructor(options: WalStreamOptions);
|
|
33
|
-
get publication_name(): string;
|
|
34
|
-
get connectionTag(): string;
|
|
35
|
-
get stopped(): boolean;
|
|
36
|
-
getQualifiedTableNames(batch: storage.BucketStorageBatch, db: pgwire.PgConnection, tablePattern: TablePattern): Promise<storage.SourceTable[]>;
|
|
37
|
-
initSlot(): Promise<InitResult>;
|
|
38
|
-
estimatedCount(db: pgwire.PgConnection, table: storage.SourceTable): Promise<string>;
|
|
39
|
-
/**
|
|
40
|
-
* Start initial replication.
|
|
41
|
-
*
|
|
42
|
-
* If (partial) replication was done before on this slot, this clears the state
|
|
43
|
-
* and starts again from scratch.
|
|
44
|
-
*/
|
|
45
|
-
startInitialReplication(replicationConnection: pgwire.PgConnection): Promise<void>;
|
|
46
|
-
initialReplication(db: pgwire.PgConnection, lsn: string): Promise<void>;
|
|
47
|
-
static getQueryData(results: Iterable<pgwire.DatabaseInputRow>): Generator<SqliteRow>;
|
|
48
|
-
private snapshotTable;
|
|
49
|
-
handleRelation(batch: storage.BucketStorageBatch, relation: PgRelation, snapshot: boolean): Promise<storage.SourceTable>;
|
|
50
|
-
private getTable;
|
|
51
|
-
writeChange(batch: storage.BucketStorageBatch, msg: pgwire.PgoutputMessage): Promise<storage.FlushedResult | null>;
|
|
52
|
-
replicate(): Promise<void>;
|
|
53
|
-
initReplication(replicationConnection: pgwire.PgConnection): Promise<void>;
|
|
54
|
-
streamChanges(replicationConnection: pgwire.PgConnection): Promise<void>;
|
|
55
|
-
ack(lsn: string, replicationStream: pgwire.ReplicationStream): Promise<void>;
|
|
56
|
-
}
|
|
57
|
-
export {};
|