@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.
- package/.probes/.gitkeep +0 -0
- package/CHANGELOG.md +82 -0
- package/LICENSE +67 -0
- package/README.md +3 -0
- package/dist/api/api-index.d.ts +2 -0
- package/dist/api/api-index.js +3 -0
- package/dist/api/api-index.js.map +1 -0
- package/dist/api/diagnostics.d.ts +21 -0
- package/dist/api/diagnostics.js +183 -0
- package/dist/api/diagnostics.js.map +1 -0
- package/dist/api/schema.d.ts +5 -0
- package/dist/api/schema.js +88 -0
- package/dist/api/schema.js.map +1 -0
- package/dist/auth/CachedKeyCollector.d.ts +46 -0
- package/dist/auth/CachedKeyCollector.js +116 -0
- package/dist/auth/CachedKeyCollector.js.map +1 -0
- package/dist/auth/CompoundKeyCollector.d.ts +8 -0
- package/dist/auth/CompoundKeyCollector.js +23 -0
- package/dist/auth/CompoundKeyCollector.js.map +1 -0
- package/dist/auth/JwtPayload.d.ts +10 -0
- package/dist/auth/JwtPayload.js +2 -0
- package/dist/auth/JwtPayload.js.map +1 -0
- package/dist/auth/KeyCollector.d.ts +24 -0
- package/dist/auth/KeyCollector.js +2 -0
- package/dist/auth/KeyCollector.js.map +1 -0
- package/dist/auth/KeySpec.d.ts +26 -0
- package/dist/auth/KeySpec.js +49 -0
- package/dist/auth/KeySpec.js.map +1 -0
- package/dist/auth/KeyStore.d.ts +39 -0
- package/dist/auth/KeyStore.js +131 -0
- package/dist/auth/KeyStore.js.map +1 -0
- package/dist/auth/LeakyBucket.d.ts +39 -0
- package/dist/auth/LeakyBucket.js +57 -0
- package/dist/auth/LeakyBucket.js.map +1 -0
- package/dist/auth/RemoteJWKSCollector.d.ts +24 -0
- package/dist/auth/RemoteJWKSCollector.js +106 -0
- package/dist/auth/RemoteJWKSCollector.js.map +1 -0
- package/dist/auth/StaticKeyCollector.d.ts +14 -0
- package/dist/auth/StaticKeyCollector.js +19 -0
- package/dist/auth/StaticKeyCollector.js.map +1 -0
- package/dist/auth/SupabaseKeyCollector.d.ts +22 -0
- package/dist/auth/SupabaseKeyCollector.js +61 -0
- package/dist/auth/SupabaseKeyCollector.js.map +1 -0
- package/dist/auth/auth-index.d.ts +10 -0
- package/dist/auth/auth-index.js +11 -0
- package/dist/auth/auth-index.js.map +1 -0
- package/dist/db/db-index.d.ts +1 -0
- package/dist/db/db-index.js +2 -0
- package/dist/db/db-index.js.map +1 -0
- package/dist/db/mongo.d.ts +29 -0
- package/dist/db/mongo.js +65 -0
- package/dist/db/mongo.js.map +1 -0
- package/dist/entry/cli-entry.d.ts +15 -0
- package/dist/entry/cli-entry.js +36 -0
- package/dist/entry/cli-entry.js.map +1 -0
- package/dist/entry/commands/config-command.d.ts +10 -0
- package/dist/entry/commands/config-command.js +21 -0
- package/dist/entry/commands/config-command.js.map +1 -0
- package/dist/entry/commands/migrate-action.d.ts +2 -0
- package/dist/entry/commands/migrate-action.js +18 -0
- package/dist/entry/commands/migrate-action.js.map +1 -0
- package/dist/entry/commands/start-action.d.ts +3 -0
- package/dist/entry/commands/start-action.js +15 -0
- package/dist/entry/commands/start-action.js.map +1 -0
- package/dist/entry/commands/teardown-action.d.ts +2 -0
- package/dist/entry/commands/teardown-action.js +17 -0
- package/dist/entry/commands/teardown-action.js.map +1 -0
- package/dist/entry/entry-index.d.ts +5 -0
- package/dist/entry/entry-index.js +6 -0
- package/dist/entry/entry-index.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/locks/LockManager.d.ts +10 -0
- package/dist/locks/LockManager.js +7 -0
- package/dist/locks/LockManager.js.map +1 -0
- package/dist/locks/MongoLocks.d.ts +36 -0
- package/dist/locks/MongoLocks.js +81 -0
- package/dist/locks/MongoLocks.js.map +1 -0
- package/dist/locks/locks-index.d.ts +2 -0
- package/dist/locks/locks-index.js +3 -0
- package/dist/locks/locks-index.js.map +1 -0
- package/dist/metrics/Metrics.d.ts +30 -0
- package/dist/metrics/Metrics.js +176 -0
- package/dist/metrics/Metrics.js.map +1 -0
- package/dist/migrations/db/migrations/1684951997326-init.d.ts +3 -0
- package/dist/migrations/db/migrations/1684951997326-init.js +31 -0
- package/dist/migrations/db/migrations/1684951997326-init.js.map +1 -0
- package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.d.ts +2 -0
- package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js +5 -0
- package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js.map +1 -0
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.d.ts +3 -0
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js +54 -0
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -0
- package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.d.ts +3 -0
- package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js +27 -0
- package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js.map +1 -0
- package/dist/migrations/definitions.d.ts +18 -0
- package/dist/migrations/definitions.js +6 -0
- package/dist/migrations/definitions.js.map +1 -0
- package/dist/migrations/executor.d.ts +16 -0
- package/dist/migrations/executor.js +64 -0
- package/dist/migrations/executor.js.map +1 -0
- package/dist/migrations/migrations-index.d.ts +3 -0
- package/dist/migrations/migrations-index.js +4 -0
- package/dist/migrations/migrations-index.js.map +1 -0
- package/dist/migrations/migrations.d.ts +10 -0
- package/dist/migrations/migrations.js +90 -0
- package/dist/migrations/migrations.js.map +1 -0
- package/dist/migrations/store/migration-store.d.ts +11 -0
- package/dist/migrations/store/migration-store.js +46 -0
- package/dist/migrations/store/migration-store.js.map +1 -0
- package/dist/replication/ErrorRateLimiter.d.ts +17 -0
- package/dist/replication/ErrorRateLimiter.js +43 -0
- package/dist/replication/ErrorRateLimiter.js.map +1 -0
- package/dist/replication/PgRelation.d.ts +16 -0
- package/dist/replication/PgRelation.js +26 -0
- package/dist/replication/PgRelation.js.map +1 -0
- package/dist/replication/WalConnection.d.ts +34 -0
- package/dist/replication/WalConnection.js +190 -0
- package/dist/replication/WalConnection.js.map +1 -0
- package/dist/replication/WalStream.d.ts +57 -0
- package/dist/replication/WalStream.js +515 -0
- package/dist/replication/WalStream.js.map +1 -0
- package/dist/replication/WalStreamManager.d.ts +30 -0
- package/dist/replication/WalStreamManager.js +198 -0
- package/dist/replication/WalStreamManager.js.map +1 -0
- package/dist/replication/WalStreamRunner.d.ts +38 -0
- package/dist/replication/WalStreamRunner.js +155 -0
- package/dist/replication/WalStreamRunner.js.map +1 -0
- package/dist/replication/replication-index.d.ts +7 -0
- package/dist/replication/replication-index.js +8 -0
- package/dist/replication/replication-index.js.map +1 -0
- package/dist/replication/util.d.ts +9 -0
- package/dist/replication/util.js +62 -0
- package/dist/replication/util.js.map +1 -0
- package/dist/routes/auth.d.ts +56 -0
- package/dist/routes/auth.js +182 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/endpoints/admin.d.ts +1011 -0
- package/dist/routes/endpoints/admin.js +207 -0
- package/dist/routes/endpoints/admin.js.map +1 -0
- package/dist/routes/endpoints/checkpointing.d.ts +76 -0
- package/dist/routes/endpoints/checkpointing.js +36 -0
- package/dist/routes/endpoints/checkpointing.js.map +1 -0
- package/dist/routes/endpoints/dev.d.ts +312 -0
- package/dist/routes/endpoints/dev.js +172 -0
- package/dist/routes/endpoints/dev.js.map +1 -0
- package/dist/routes/endpoints/route-endpoints-index.d.ts +6 -0
- package/dist/routes/endpoints/route-endpoints-index.js +7 -0
- package/dist/routes/endpoints/route-endpoints-index.js.map +1 -0
- package/dist/routes/endpoints/socket-route.d.ts +2 -0
- package/dist/routes/endpoints/socket-route.js +119 -0
- package/dist/routes/endpoints/socket-route.js.map +1 -0
- package/dist/routes/endpoints/sync-rules.d.ts +174 -0
- package/dist/routes/endpoints/sync-rules.js +202 -0
- package/dist/routes/endpoints/sync-rules.js.map +1 -0
- package/dist/routes/endpoints/sync-stream.d.ts +132 -0
- package/dist/routes/endpoints/sync-stream.js +83 -0
- package/dist/routes/endpoints/sync-stream.js.map +1 -0
- package/dist/routes/hooks.d.ts +10 -0
- package/dist/routes/hooks.js +32 -0
- package/dist/routes/hooks.js.map +1 -0
- package/dist/routes/route-register.d.ts +10 -0
- package/dist/routes/route-register.js +87 -0
- package/dist/routes/route-register.js.map +1 -0
- package/dist/routes/router-socket.d.ts +10 -0
- package/dist/routes/router-socket.js +5 -0
- package/dist/routes/router-socket.js.map +1 -0
- package/dist/routes/router.d.ts +26 -0
- package/dist/routes/router.js +7 -0
- package/dist/routes/router.js.map +1 -0
- package/dist/routes/routes-index.d.ts +6 -0
- package/dist/routes/routes-index.js +7 -0
- package/dist/routes/routes-index.js.map +1 -0
- package/dist/runner/teardown.d.ts +2 -0
- package/dist/runner/teardown.js +94 -0
- package/dist/runner/teardown.js.map +1 -0
- package/dist/storage/BucketStorage.d.ts +307 -0
- package/dist/storage/BucketStorage.js +25 -0
- package/dist/storage/BucketStorage.js.map +1 -0
- package/dist/storage/ChecksumCache.d.ts +50 -0
- package/dist/storage/ChecksumCache.js +234 -0
- package/dist/storage/ChecksumCache.js.map +1 -0
- package/dist/storage/MongoBucketStorage.d.ts +52 -0
- package/dist/storage/MongoBucketStorage.js +409 -0
- package/dist/storage/MongoBucketStorage.js.map +1 -0
- package/dist/storage/SourceTable.d.ts +39 -0
- package/dist/storage/SourceTable.js +50 -0
- package/dist/storage/SourceTable.js.map +1 -0
- package/dist/storage/mongo/MongoBucketBatch.d.ts +48 -0
- package/dist/storage/mongo/MongoBucketBatch.js +581 -0
- package/dist/storage/mongo/MongoBucketBatch.js.map +1 -0
- package/dist/storage/mongo/MongoIdSequence.d.ts +12 -0
- package/dist/storage/mongo/MongoIdSequence.js +21 -0
- package/dist/storage/mongo/MongoIdSequence.js.map +1 -0
- package/dist/storage/mongo/MongoPersistedSyncRules.d.ts +9 -0
- package/dist/storage/mongo/MongoPersistedSyncRules.js +9 -0
- package/dist/storage/mongo/MongoPersistedSyncRules.js.map +1 -0
- package/dist/storage/mongo/MongoPersistedSyncRulesContent.d.ts +20 -0
- package/dist/storage/mongo/MongoPersistedSyncRulesContent.js +26 -0
- package/dist/storage/mongo/MongoPersistedSyncRulesContent.js.map +1 -0
- package/dist/storage/mongo/MongoSyncBucketStorage.d.ts +29 -0
- package/dist/storage/mongo/MongoSyncBucketStorage.js +391 -0
- package/dist/storage/mongo/MongoSyncBucketStorage.js.map +1 -0
- package/dist/storage/mongo/MongoSyncRulesLock.d.ts +16 -0
- package/dist/storage/mongo/MongoSyncRulesLock.js +65 -0
- package/dist/storage/mongo/MongoSyncRulesLock.js.map +1 -0
- package/dist/storage/mongo/OperationBatch.d.ts +26 -0
- package/dist/storage/mongo/OperationBatch.js +101 -0
- package/dist/storage/mongo/OperationBatch.js.map +1 -0
- package/dist/storage/mongo/PersistedBatch.d.ts +46 -0
- package/dist/storage/mongo/PersistedBatch.js +213 -0
- package/dist/storage/mongo/PersistedBatch.js.map +1 -0
- package/dist/storage/mongo/db.d.ts +26 -0
- package/dist/storage/mongo/db.js +35 -0
- package/dist/storage/mongo/db.js.map +1 -0
- package/dist/storage/mongo/models.d.ts +140 -0
- package/dist/storage/mongo/models.js +27 -0
- package/dist/storage/mongo/models.js.map +1 -0
- package/dist/storage/mongo/util.d.ts +26 -0
- package/dist/storage/mongo/util.js +81 -0
- package/dist/storage/mongo/util.js.map +1 -0
- package/dist/storage/storage-index.d.ts +14 -0
- package/dist/storage/storage-index.js +15 -0
- package/dist/storage/storage-index.js.map +1 -0
- package/dist/sync/BroadcastIterable.d.ts +38 -0
- package/dist/sync/BroadcastIterable.js +153 -0
- package/dist/sync/BroadcastIterable.js.map +1 -0
- package/dist/sync/LastValueSink.d.ts +25 -0
- package/dist/sync/LastValueSink.js +84 -0
- package/dist/sync/LastValueSink.js.map +1 -0
- package/dist/sync/merge.d.ts +39 -0
- package/dist/sync/merge.js +175 -0
- package/dist/sync/merge.js.map +1 -0
- package/dist/sync/safeRace.d.ts +1 -0
- package/dist/sync/safeRace.js +91 -0
- package/dist/sync/safeRace.js.map +1 -0
- package/dist/sync/sync-index.d.ts +6 -0
- package/dist/sync/sync-index.js +7 -0
- package/dist/sync/sync-index.js.map +1 -0
- package/dist/sync/sync.d.ts +18 -0
- package/dist/sync/sync.js +259 -0
- package/dist/sync/sync.js.map +1 -0
- package/dist/sync/util.d.ts +26 -0
- package/dist/sync/util.js +73 -0
- package/dist/sync/util.js.map +1 -0
- package/dist/system/CorePowerSyncSystem.d.ts +23 -0
- package/dist/system/CorePowerSyncSystem.js +52 -0
- package/dist/system/CorePowerSyncSystem.js.map +1 -0
- package/dist/system/system-index.d.ts +1 -0
- package/dist/system/system-index.js +2 -0
- package/dist/system/system-index.js.map +1 -0
- package/dist/util/Mutex.d.ts +47 -0
- package/dist/util/Mutex.js +132 -0
- package/dist/util/Mutex.js.map +1 -0
- package/dist/util/PgManager.d.ts +24 -0
- package/dist/util/PgManager.js +55 -0
- package/dist/util/PgManager.js.map +1 -0
- package/dist/util/alerting.d.ts +2 -0
- package/dist/util/alerting.js +8 -0
- package/dist/util/alerting.js.map +1 -0
- package/dist/util/config/collectors/config-collector.d.ts +29 -0
- package/dist/util/config/collectors/config-collector.js +116 -0
- package/dist/util/config/collectors/config-collector.js.map +1 -0
- package/dist/util/config/collectors/impl/base64-config-collector.d.ts +6 -0
- package/dist/util/config/collectors/impl/base64-config-collector.js +15 -0
- package/dist/util/config/collectors/impl/base64-config-collector.js.map +1 -0
- package/dist/util/config/collectors/impl/fallback-config-collector.d.ts +11 -0
- package/dist/util/config/collectors/impl/fallback-config-collector.js +19 -0
- package/dist/util/config/collectors/impl/fallback-config-collector.js.map +1 -0
- package/dist/util/config/collectors/impl/filesystem-config-collector.d.ts +6 -0
- package/dist/util/config/collectors/impl/filesystem-config-collector.js +37 -0
- package/dist/util/config/collectors/impl/filesystem-config-collector.js.map +1 -0
- package/dist/util/config/compound-config-collector.d.ts +32 -0
- package/dist/util/config/compound-config-collector.js +130 -0
- package/dist/util/config/compound-config-collector.js.map +1 -0
- package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.d.ts +7 -0
- package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js +17 -0
- package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -0
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.d.ts +7 -0
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js +21 -0
- package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -0
- package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.d.ts +7 -0
- package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js +17 -0
- package/dist/util/config/sync-rules/impl/inline-sync-rules-collector.js.map +1 -0
- package/dist/util/config/sync-rules/sync-collector.d.ts +6 -0
- package/dist/util/config/sync-rules/sync-collector.js +3 -0
- package/dist/util/config/sync-rules/sync-collector.js.map +1 -0
- package/dist/util/config/types.d.ts +57 -0
- package/dist/util/config/types.js +7 -0
- package/dist/util/config/types.js.map +1 -0
- package/dist/util/config.d.ts +7 -0
- package/dist/util/config.js +35 -0
- package/dist/util/config.js.map +1 -0
- package/dist/util/env.d.ts +9 -0
- package/dist/util/env.js +26 -0
- package/dist/util/env.js.map +1 -0
- package/dist/util/memory-tracking.d.ts +7 -0
- package/dist/util/memory-tracking.js +58 -0
- package/dist/util/memory-tracking.js.map +1 -0
- package/dist/util/migration_lib.d.ts +11 -0
- package/dist/util/migration_lib.js +64 -0
- package/dist/util/migration_lib.js.map +1 -0
- package/dist/util/pgwire_utils.d.ts +24 -0
- package/dist/util/pgwire_utils.js +117 -0
- package/dist/util/pgwire_utils.js.map +1 -0
- package/dist/util/populate_test_data.d.ts +8 -0
- package/dist/util/populate_test_data.js +65 -0
- package/dist/util/populate_test_data.js.map +1 -0
- package/dist/util/protocol-types.d.ts +182 -0
- package/dist/util/protocol-types.js +42 -0
- package/dist/util/protocol-types.js.map +1 -0
- package/dist/util/secs.d.ts +2 -0
- package/dist/util/secs.js +49 -0
- package/dist/util/secs.js.map +1 -0
- package/dist/util/util-index.d.ts +22 -0
- package/dist/util/util-index.js +23 -0
- package/dist/util/util-index.js.map +1 -0
- package/dist/util/utils.d.ts +17 -0
- package/dist/util/utils.js +92 -0
- package/dist/util/utils.js.map +1 -0
- package/package.json +59 -0
- package/src/api/api-index.ts +2 -0
- package/src/api/diagnostics.ts +221 -0
- package/src/api/schema.ts +99 -0
- package/src/auth/CachedKeyCollector.ts +132 -0
- package/src/auth/CompoundKeyCollector.ts +33 -0
- package/src/auth/JwtPayload.ts +11 -0
- package/src/auth/KeyCollector.ts +27 -0
- package/src/auth/KeySpec.ts +67 -0
- package/src/auth/KeyStore.ts +156 -0
- package/src/auth/LeakyBucket.ts +66 -0
- package/src/auth/RemoteJWKSCollector.ts +130 -0
- package/src/auth/StaticKeyCollector.ts +21 -0
- package/src/auth/SupabaseKeyCollector.ts +67 -0
- package/src/auth/auth-index.ts +10 -0
- package/src/db/db-index.ts +1 -0
- package/src/db/mongo.ts +72 -0
- package/src/entry/cli-entry.ts +40 -0
- package/src/entry/commands/config-command.ts +36 -0
- package/src/entry/commands/migrate-action.ts +25 -0
- package/src/entry/commands/start-action.ts +24 -0
- package/src/entry/commands/teardown-action.ts +23 -0
- package/src/entry/entry-index.ts +5 -0
- package/src/index.ts +40 -0
- package/src/locks/LockManager.ts +16 -0
- package/src/locks/MongoLocks.ts +142 -0
- package/src/locks/locks-index.ts +2 -0
- package/src/metrics/Metrics.ts +265 -0
- package/src/migrations/db/migrations/1684951997326-init.ts +33 -0
- package/src/migrations/db/migrations/1688556755264-initial-sync-rules.ts +5 -0
- package/src/migrations/db/migrations/1702295701188-sync-rule-state.ts +99 -0
- package/src/migrations/db/migrations/1711543888062-write-checkpoint-index.ts +32 -0
- package/src/migrations/definitions.ts +21 -0
- package/src/migrations/executor.ts +87 -0
- package/src/migrations/migrations-index.ts +3 -0
- package/src/migrations/migrations.ts +118 -0
- package/src/migrations/store/migration-store.ts +63 -0
- package/src/replication/ErrorRateLimiter.ts +50 -0
- package/src/replication/PgRelation.ts +42 -0
- package/src/replication/WalConnection.ts +227 -0
- package/src/replication/WalStream.ts +624 -0
- package/src/replication/WalStreamManager.ts +213 -0
- package/src/replication/WalStreamRunner.ts +180 -0
- package/src/replication/replication-index.ts +7 -0
- package/src/replication/util.ts +76 -0
- package/src/routes/auth.ts +215 -0
- package/src/routes/endpoints/admin.ts +237 -0
- package/src/routes/endpoints/checkpointing.ts +41 -0
- package/src/routes/endpoints/dev.ts +199 -0
- package/src/routes/endpoints/route-endpoints-index.ts +6 -0
- package/src/routes/endpoints/socket-route.ts +135 -0
- package/src/routes/endpoints/sync-rules.ts +227 -0
- package/src/routes/endpoints/sync-stream.ts +101 -0
- package/src/routes/hooks.ts +46 -0
- package/src/routes/route-register.ts +104 -0
- package/src/routes/router-socket.ts +13 -0
- package/src/routes/router.ts +46 -0
- package/src/routes/routes-index.ts +6 -0
- package/src/runner/teardown.ts +108 -0
- package/src/storage/BucketStorage.ts +396 -0
- package/src/storage/ChecksumCache.ts +294 -0
- package/src/storage/MongoBucketStorage.ts +519 -0
- package/src/storage/SourceTable.ts +60 -0
- package/src/storage/mongo/MongoBucketBatch.ts +752 -0
- package/src/storage/mongo/MongoIdSequence.ts +24 -0
- package/src/storage/mongo/MongoPersistedSyncRules.ts +16 -0
- package/src/storage/mongo/MongoPersistedSyncRulesContent.ts +47 -0
- package/src/storage/mongo/MongoSyncBucketStorage.ts +533 -0
- package/src/storage/mongo/MongoSyncRulesLock.ts +81 -0
- package/src/storage/mongo/OperationBatch.ts +115 -0
- package/src/storage/mongo/PersistedBatch.ts +268 -0
- package/src/storage/mongo/db.ts +73 -0
- package/src/storage/mongo/models.ts +162 -0
- package/src/storage/mongo/util.ts +88 -0
- package/src/storage/storage-index.ts +15 -0
- package/src/sync/BroadcastIterable.ts +161 -0
- package/src/sync/LastValueSink.ts +100 -0
- package/src/sync/merge.ts +200 -0
- package/src/sync/safeRace.ts +99 -0
- package/src/sync/sync-index.ts +6 -0
- package/src/sync/sync.ts +319 -0
- package/src/sync/util.ts +98 -0
- package/src/system/CorePowerSyncSystem.ts +64 -0
- package/src/system/system-index.ts +1 -0
- package/src/util/Mutex.ts +159 -0
- package/src/util/PgManager.ts +64 -0
- package/src/util/alerting.ts +9 -0
- package/src/util/config/collectors/config-collector.ts +143 -0
- package/src/util/config/collectors/impl/base64-config-collector.ts +18 -0
- package/src/util/config/collectors/impl/fallback-config-collector.ts +22 -0
- package/src/util/config/collectors/impl/filesystem-config-collector.ts +43 -0
- package/src/util/config/compound-config-collector.ts +176 -0
- package/src/util/config/sync-rules/impl/base64-sync-rules-collector.ts +21 -0
- package/src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts +26 -0
- package/src/util/config/sync-rules/impl/inline-sync-rules-collector.ts +21 -0
- package/src/util/config/sync-rules/sync-collector.ts +8 -0
- package/src/util/config/types.ts +66 -0
- package/src/util/config.ts +39 -0
- package/src/util/env.ts +30 -0
- package/src/util/memory-tracking.ts +67 -0
- package/src/util/migration_lib.ts +79 -0
- package/src/util/pgwire_utils.ts +139 -0
- package/src/util/populate_test_data.ts +78 -0
- package/src/util/protocol-types.ts +228 -0
- package/src/util/secs.ts +54 -0
- package/src/util/util-index.ts +25 -0
- package/src/util/utils.ts +122 -0
- package/test/src/__snapshots__/pg_test.test.ts.snap +256 -0
- package/test/src/__snapshots__/sync.test.ts.snap +247 -0
- package/test/src/auth.test.ts +342 -0
- package/test/src/broadcast_iterable.test.ts +156 -0
- package/test/src/checksum_cache.test.ts +436 -0
- package/test/src/data_storage.test.ts +1176 -0
- package/test/src/env.ts +8 -0
- package/test/src/large_batch.test.ts +194 -0
- package/test/src/merge_iterable.test.ts +355 -0
- package/test/src/pg_test.test.ts +450 -0
- package/test/src/schema_changes.test.ts +545 -0
- package/test/src/setup.ts +7 -0
- package/test/src/slow_tests.test.ts +257 -0
- package/test/src/sql_functions.test.ts +254 -0
- package/test/src/sql_operators.test.ts +132 -0
- package/test/src/sync.test.ts +293 -0
- package/test/src/sync_rules.test.ts +1053 -0
- package/test/src/util.ts +76 -0
- package/test/src/validation.test.ts +63 -0
- package/test/src/wal_stream.test.ts +319 -0
- package/test/src/wal_stream_utils.ts +147 -0
- package/test/tsconfig.json +20 -0
- package/tsconfig.json +31 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { normalizeConnection } from '@powersync/service-types';
|
|
2
|
+
import * as auth from '../../auth/auth-index.js';
|
|
3
|
+
import { Base64ConfigCollector } from './collectors/impl/base64-config-collector.js';
|
|
4
|
+
import { FileSystemConfigCollector } from './collectors/impl/filesystem-config-collector.js';
|
|
5
|
+
import { Base64SyncRulesCollector } from './sync-rules/impl/base64-sync-rules-collector.js';
|
|
6
|
+
import { InlineSyncRulesCollector } from './sync-rules/impl/inline-sync-rules-collector.js';
|
|
7
|
+
import { FileSystemSyncRulesCollector } from './sync-rules/impl/filesystem-sync-rules-collector.js';
|
|
8
|
+
import { FallbackConfigCollector } from './collectors/impl/fallback-config-collector.js';
|
|
9
|
+
import { logger } from '@powersync/lib-services-framework';
|
|
10
|
+
const POWERSYNC_DEV_KID = 'powersync-dev';
|
|
11
|
+
const DEFAULT_COLLECTOR_OPTIONS = {
|
|
12
|
+
configCollectors: [new Base64ConfigCollector(), new FileSystemConfigCollector(), new FallbackConfigCollector()],
|
|
13
|
+
syncRulesCollectors: [
|
|
14
|
+
new Base64SyncRulesCollector(),
|
|
15
|
+
new FileSystemSyncRulesCollector(),
|
|
16
|
+
new InlineSyncRulesCollector()
|
|
17
|
+
]
|
|
18
|
+
};
|
|
19
|
+
export class CompoundConfigCollector {
|
|
20
|
+
constructor(options = DEFAULT_COLLECTOR_OPTIONS) {
|
|
21
|
+
this.options = options;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Collects and resolves base config
|
|
25
|
+
*/
|
|
26
|
+
async collectConfig(runner_config = {}) {
|
|
27
|
+
const baseConfig = await this.collectBaseConfig(runner_config);
|
|
28
|
+
const connections = baseConfig.replication?.connections ?? [];
|
|
29
|
+
if (connections.length > 1) {
|
|
30
|
+
throw new Error('Only a single replication connection is supported currently');
|
|
31
|
+
}
|
|
32
|
+
const mapped = connections.map((c) => {
|
|
33
|
+
const conf = {
|
|
34
|
+
type: 'postgresql',
|
|
35
|
+
...normalizeConnection(c),
|
|
36
|
+
debug_api: c.debug_api ?? false
|
|
37
|
+
};
|
|
38
|
+
return conf;
|
|
39
|
+
});
|
|
40
|
+
const collectors = new auth.CompoundKeyCollector();
|
|
41
|
+
const keyStore = new auth.KeyStore(collectors);
|
|
42
|
+
const inputKeys = baseConfig.client_auth?.jwks?.keys ?? [];
|
|
43
|
+
const staticCollector = await auth.StaticKeyCollector.importKeys(inputKeys);
|
|
44
|
+
collectors.add(staticCollector);
|
|
45
|
+
if (baseConfig.client_auth?.supabase && mapped.length > 0) {
|
|
46
|
+
collectors.add(new auth.CachedKeyCollector(new auth.SupabaseKeyCollector(mapped[0])));
|
|
47
|
+
}
|
|
48
|
+
let jwks_uris = baseConfig.client_auth?.jwks_uri ?? [];
|
|
49
|
+
if (typeof jwks_uris == 'string') {
|
|
50
|
+
jwks_uris = [jwks_uris];
|
|
51
|
+
}
|
|
52
|
+
for (let uri of jwks_uris) {
|
|
53
|
+
collectors.add(new auth.CachedKeyCollector(new auth.RemoteJWKSCollector(uri, { block_local_ip: !!baseConfig.client_auth?.block_local_jwks })));
|
|
54
|
+
}
|
|
55
|
+
const baseDevKey = (baseConfig.client_auth?.jwks?.keys ?? []).find((key) => key.kid == POWERSYNC_DEV_KID);
|
|
56
|
+
let devKey;
|
|
57
|
+
if (baseConfig.dev?.demo_auth && baseDevKey != null && baseDevKey.kty == 'oct') {
|
|
58
|
+
devKey = await auth.KeySpec.importKey(baseDevKey);
|
|
59
|
+
}
|
|
60
|
+
const sync_rules = await this.collectSyncRules(baseConfig, runner_config);
|
|
61
|
+
let jwt_audiences = baseConfig.client_auth?.audience ?? [];
|
|
62
|
+
let config = {
|
|
63
|
+
connection: mapped[0],
|
|
64
|
+
storage: baseConfig.storage,
|
|
65
|
+
client_keystore: keyStore,
|
|
66
|
+
// Dev tokens only use the static keys, no external key sources
|
|
67
|
+
// We may restrict this even further to only the powersync-dev key.
|
|
68
|
+
dev_client_keystore: new auth.KeyStore(staticCollector),
|
|
69
|
+
api_tokens: baseConfig.api?.tokens ?? [],
|
|
70
|
+
dev: {
|
|
71
|
+
demo_auth: baseConfig.dev?.demo_auth ?? false,
|
|
72
|
+
demo_client: baseConfig.dev?.demo_client ?? false,
|
|
73
|
+
demo_password: baseConfig.dev?.demo_password,
|
|
74
|
+
crud_api: baseConfig.dev?.crud_api ?? false,
|
|
75
|
+
dev_key: devKey
|
|
76
|
+
},
|
|
77
|
+
port: baseConfig.port ?? 8080,
|
|
78
|
+
sync_rules,
|
|
79
|
+
jwt_audiences,
|
|
80
|
+
token_max_expiration: '1d',
|
|
81
|
+
metadata: baseConfig.metadata ?? {},
|
|
82
|
+
migrations: baseConfig.migrations,
|
|
83
|
+
telemetry: {
|
|
84
|
+
disable_telemetry_sharing: baseConfig.telemetry?.disable_telemetry_sharing ?? false,
|
|
85
|
+
internal_service_endpoint: baseConfig.telemetry?.internal_service_endpoint ?? 'https://pulse.journeyapps.com/v1/metrics'
|
|
86
|
+
},
|
|
87
|
+
slot_name_prefix: connections[0]?.slot_name_prefix ?? 'powersync_'
|
|
88
|
+
};
|
|
89
|
+
return config;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Collects the base PowerSyncConfig from various registered collectors.
|
|
93
|
+
* @throws if no collector could return a configuration.
|
|
94
|
+
*/
|
|
95
|
+
async collectBaseConfig(runner_config) {
|
|
96
|
+
for (const collector of this.options.configCollectors) {
|
|
97
|
+
try {
|
|
98
|
+
const baseConfig = await collector.collect(runner_config);
|
|
99
|
+
if (baseConfig) {
|
|
100
|
+
return baseConfig;
|
|
101
|
+
}
|
|
102
|
+
logger.debug(`Could not collect PowerSync config with ${collector.name} method. Moving on to next method if available.`);
|
|
103
|
+
}
|
|
104
|
+
catch (ex) {
|
|
105
|
+
// An error in a collector is a hard stop
|
|
106
|
+
throw new Error(`Could not collect config using ${collector.name} method. Caught exception: ${ex}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
throw new Error('PowerSyncConfig could not be collected using any of the registered config collectors.');
|
|
110
|
+
}
|
|
111
|
+
async collectSyncRules(baseConfig, runnerConfig) {
|
|
112
|
+
for (const collector of this.options.syncRulesCollectors) {
|
|
113
|
+
try {
|
|
114
|
+
const config = await collector.collect(baseConfig, runnerConfig);
|
|
115
|
+
if (config) {
|
|
116
|
+
return config;
|
|
117
|
+
}
|
|
118
|
+
logger.debug(`Could not collect sync rules with ${collector.name} method. Moving on to next method if available.`);
|
|
119
|
+
}
|
|
120
|
+
catch (ex) {
|
|
121
|
+
// An error in a collector is a hard stop
|
|
122
|
+
throw new Error(`Could not collect sync rules using ${collector.name} method. Caught exception: ${ex}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
present: false
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=compound-config-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound-config-collector.js","sourceRoot":"","sources":["../../../src/util/config/compound-config-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RunnerConfig, SyncRulesConfig } from '../../types.js';
|
|
2
|
+
import { SyncRulesCollector } from '../sync-collector.js';
|
|
3
|
+
import { configFile } from '@powersync/service-types';
|
|
4
|
+
export declare class Base64SyncRulesCollector extends SyncRulesCollector {
|
|
5
|
+
get name(): string;
|
|
6
|
+
collect(baseConfig: configFile.PowerSyncConfig, runnerConfig: RunnerConfig): Promise<SyncRulesConfig | null>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SyncRulesCollector } from '../sync-collector.js';
|
|
2
|
+
export class Base64SyncRulesCollector extends SyncRulesCollector {
|
|
3
|
+
get name() {
|
|
4
|
+
return 'Base64';
|
|
5
|
+
}
|
|
6
|
+
async collect(baseConfig, runnerConfig) {
|
|
7
|
+
const { sync_rules_base64 } = runnerConfig;
|
|
8
|
+
if (!sync_rules_base64) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
present: true,
|
|
13
|
+
content: Buffer.from(sync_rules_base64, 'base64').toString()
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=base64-sync-rules-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/base64-sync-rules-collector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,EAAE,iBAAiB,EAAE,GAAG,YAAY,CAAC;QAC3C,IAAI,CAAC,iBAAiB,EAAE;YACtB,OAAO,IAAI,CAAC;SACb;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE;SAC7D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RunnerConfig, SyncRulesConfig } from '../../types.js';
|
|
2
|
+
import { SyncRulesCollector } from '../sync-collector.js';
|
|
3
|
+
import { configFile } from '@powersync/service-types';
|
|
4
|
+
export declare class FileSystemSyncRulesCollector extends SyncRulesCollector {
|
|
5
|
+
get name(): string;
|
|
6
|
+
collect(baseConfig: configFile.PowerSyncConfig, runnerConfig: RunnerConfig): Promise<SyncRulesConfig | null>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { SyncRulesCollector } from '../sync-collector.js';
|
|
3
|
+
export class FileSystemSyncRulesCollector extends SyncRulesCollector {
|
|
4
|
+
get name() {
|
|
5
|
+
return 'FileSystem';
|
|
6
|
+
}
|
|
7
|
+
async collect(baseConfig, runnerConfig) {
|
|
8
|
+
const sync_path = baseConfig.sync_rules?.path;
|
|
9
|
+
if (!sync_path) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const { config_path } = runnerConfig;
|
|
13
|
+
// Depending on the container, the sync rules may not actually be present.
|
|
14
|
+
// Only persist the path here, and load on demand using `loadSyncRules()`.
|
|
15
|
+
return {
|
|
16
|
+
present: true,
|
|
17
|
+
path: config_path ? path.resolve(path.dirname(config_path), sync_path) : sync_path
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=filesystem-sync-rules-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,4BAA6B,SAAQ,kBAAkB;IAClE,IAAI,IAAI;QACN,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC,EAAE,YAA0B;QAC9E,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,IAAI,CAAC;SACb;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC;QAErC,0EAA0E;QAC1E,0EAA0E;QAC1E,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;SACnF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SyncRulesConfig } from '../../types.js';
|
|
2
|
+
import { SyncRulesCollector } from '../sync-collector.js';
|
|
3
|
+
import { configFile } from '@powersync/service-types';
|
|
4
|
+
export declare class InlineSyncRulesCollector extends SyncRulesCollector {
|
|
5
|
+
get name(): string;
|
|
6
|
+
collect(baseConfig: configFile.PowerSyncConfig): Promise<SyncRulesConfig | null>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SyncRulesCollector } from '../sync-collector.js';
|
|
2
|
+
export class InlineSyncRulesCollector extends SyncRulesCollector {
|
|
3
|
+
get name() {
|
|
4
|
+
return 'Inline';
|
|
5
|
+
}
|
|
6
|
+
async collect(baseConfig) {
|
|
7
|
+
const content = baseConfig.sync_rules?.content;
|
|
8
|
+
if (!content) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
present: true,
|
|
13
|
+
...baseConfig.sync_rules
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=inline-sync-rules-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-sync-rules-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/sync-rules/impl/inline-sync-rules-collector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAC9D,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsC;QAClD,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,IAAI,CAAC;SACb;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,UAAU,CAAC,UAAU;SACzB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { configFile } from '@powersync/service-types';
|
|
2
|
+
import { RunnerConfig, SyncRulesConfig } from '../types.js';
|
|
3
|
+
export declare abstract class SyncRulesCollector {
|
|
4
|
+
abstract get name(): string;
|
|
5
|
+
abstract collect(baseConfig: configFile.PowerSyncConfig, runnerConfig: RunnerConfig): Promise<SyncRulesConfig | null>;
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-collector.js","sourceRoot":"","sources":["../../../../src/util/config/sync-rules/sync-collector.ts"],"names":[],"mappings":"AAGA,MAAM,OAAgB,kBAAkB;CAIvC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { NormalizedPostgresConnection, configFile } from '@powersync/service-types';
|
|
2
|
+
import { KeySpec } from '../../auth/KeySpec.js';
|
|
3
|
+
import { KeyStore } from '../../auth/KeyStore.js';
|
|
4
|
+
export declare enum ServiceRunner {
|
|
5
|
+
UNIFIED = "unified",
|
|
6
|
+
API = "api",
|
|
7
|
+
SYNC = "sync"
|
|
8
|
+
}
|
|
9
|
+
export type RunnerConfig = {
|
|
10
|
+
config_path?: string;
|
|
11
|
+
config_base64?: string;
|
|
12
|
+
sync_rules_base64?: string;
|
|
13
|
+
};
|
|
14
|
+
export type MigrationContext = {
|
|
15
|
+
runner_config: RunnerConfig;
|
|
16
|
+
};
|
|
17
|
+
export type Runner = (config: RunnerConfig) => Promise<void>;
|
|
18
|
+
export type ResolvedConnection = configFile.PostgresConnection & NormalizedPostgresConnection;
|
|
19
|
+
export type SyncRulesConfig = {
|
|
20
|
+
present: boolean;
|
|
21
|
+
content?: string;
|
|
22
|
+
path?: string;
|
|
23
|
+
};
|
|
24
|
+
export type ResolvedPowerSyncConfig = {
|
|
25
|
+
connection?: ResolvedConnection;
|
|
26
|
+
storage: configFile.StorageConfig;
|
|
27
|
+
dev: {
|
|
28
|
+
demo_auth: boolean;
|
|
29
|
+
demo_password?: string;
|
|
30
|
+
crud_api: boolean;
|
|
31
|
+
demo_client: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Only present when demo_auth == true
|
|
34
|
+
*/
|
|
35
|
+
dev_key?: KeySpec;
|
|
36
|
+
};
|
|
37
|
+
client_keystore: KeyStore;
|
|
38
|
+
/**
|
|
39
|
+
* Keystore for development tokens.
|
|
40
|
+
*/
|
|
41
|
+
dev_client_keystore: KeyStore;
|
|
42
|
+
port: number;
|
|
43
|
+
sync_rules: SyncRulesConfig;
|
|
44
|
+
api_tokens: string[];
|
|
45
|
+
jwt_audiences: string[];
|
|
46
|
+
token_max_expiration: string;
|
|
47
|
+
metadata: Record<string, string>;
|
|
48
|
+
migrations?: {
|
|
49
|
+
disable_auto_migration?: boolean;
|
|
50
|
+
};
|
|
51
|
+
telemetry: {
|
|
52
|
+
disable_telemetry_sharing: boolean;
|
|
53
|
+
internal_service_endpoint: string;
|
|
54
|
+
};
|
|
55
|
+
/** Prefix for postgres replication slot names. May eventually be connection-specific. */
|
|
56
|
+
slot_name_prefix: string;
|
|
57
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/util/config/types.ts"],"names":[],"mappings":"AAIA,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4BAAW,CAAA;IACX,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ResolvedConnection, ResolvedPowerSyncConfig, RunnerConfig } from './config/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a single URI from full postgres credentials.
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildDemoPgUri(options: ResolvedConnection): string;
|
|
6
|
+
export declare function loadConfig(runnerConfig?: RunnerConfig): Promise<ResolvedPowerSyncConfig>;
|
|
7
|
+
export declare function loadSyncRules(config: ResolvedPowerSyncConfig): Promise<string | undefined>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import { baseUri } from '@powersync/service-types';
|
|
3
|
+
import { CompoundConfigCollector } from './config/compound-config-collector.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build a single URI from full postgres credentials.
|
|
6
|
+
*/
|
|
7
|
+
export function buildDemoPgUri(options) {
|
|
8
|
+
if (!options.debug_api) {
|
|
9
|
+
throw new Error('Not supported');
|
|
10
|
+
}
|
|
11
|
+
const uri = new URL(baseUri(options));
|
|
12
|
+
uri.username = options.username;
|
|
13
|
+
uri.password = options.password;
|
|
14
|
+
if (options.sslmode != 'disable') {
|
|
15
|
+
// verify-full is tricky to actually use on a client, since they won't have the cert
|
|
16
|
+
// Just use "require" by default
|
|
17
|
+
// uri.searchParams.set('sslmode', options.sslmode);
|
|
18
|
+
uri.searchParams.set('sslmode', 'require');
|
|
19
|
+
}
|
|
20
|
+
return uri.toString();
|
|
21
|
+
}
|
|
22
|
+
export function loadConfig(runnerConfig = {}) {
|
|
23
|
+
const collector = new CompoundConfigCollector();
|
|
24
|
+
return collector.collectConfig(runnerConfig);
|
|
25
|
+
}
|
|
26
|
+
export async function loadSyncRules(config) {
|
|
27
|
+
const sync_rules = config.sync_rules;
|
|
28
|
+
if (sync_rules.content) {
|
|
29
|
+
return sync_rules.content;
|
|
30
|
+
}
|
|
31
|
+
else if (sync_rules.path) {
|
|
32
|
+
return await fs.readFile(sync_rules.path, 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/util/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAEhF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAA2B;IACxD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;KAClC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,IAAI,OAAO,CAAC,OAAO,IAAI,SAAS,EAAE;QAChC,oFAAoF;QACpF,gCAAgC;QAChC,oDAAoD;QACpD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;KAC5C;IACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,eAA6B,EAAE;IACxD,MAAM,SAAS,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAChD,OAAO,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA+B;IACjE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,IAAI,UAAU,CAAC,OAAO,EAAE;QACtB,OAAO,UAAU,CAAC,OAAO,CAAC;KAC3B;SAAM,IAAI,UAAU,CAAC,IAAI,EAAE;QAC1B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;KACpD;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const env: {
|
|
2
|
+
PS_RUNNER_TYPE: string;
|
|
3
|
+
POWERSYNC_CONFIG_PATH?: string | undefined;
|
|
4
|
+
POWERSYNC_CONFIG_B64?: string | undefined;
|
|
5
|
+
POWERSYNC_SYNC_RULES_B64?: string | undefined;
|
|
6
|
+
METRICS_PORT?: number | undefined;
|
|
7
|
+
NODE_ENV?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
export type Env = typeof env;
|
package/dist/util/env.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { utils } from '@powersync/lib-services-framework';
|
|
2
|
+
import { ServiceRunner } from './config/types.js';
|
|
3
|
+
export const env = utils.collectEnvironmentVariables({
|
|
4
|
+
/**
|
|
5
|
+
* Path to configuration file in filesystem
|
|
6
|
+
*/
|
|
7
|
+
POWERSYNC_CONFIG_PATH: utils.type.string.optional(),
|
|
8
|
+
/**
|
|
9
|
+
* Base64 encoded contents of configuration file
|
|
10
|
+
*/
|
|
11
|
+
POWERSYNC_CONFIG_B64: utils.type.string.optional(),
|
|
12
|
+
/**
|
|
13
|
+
* Base64 encoded contents of sync rules YAML
|
|
14
|
+
*/
|
|
15
|
+
POWERSYNC_SYNC_RULES_B64: utils.type.string.optional(),
|
|
16
|
+
/**
|
|
17
|
+
* Runner to be started in this process
|
|
18
|
+
*/
|
|
19
|
+
PS_RUNNER_TYPE: utils.type.string.default(ServiceRunner.UNIFIED),
|
|
20
|
+
/**
|
|
21
|
+
* Port for metrics
|
|
22
|
+
*/
|
|
23
|
+
METRICS_PORT: utils.type.number.optional(),
|
|
24
|
+
NODE_ENV: utils.type.string.optional()
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,2BAA2B,CAAC;IACnD;;OAEG;IACH,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACnD;;OAEG;IACH,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IAClD;;OAEG;IACH,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IACtD;;OAEG;IACH,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;IAChE;;OAEG;IACH,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;IAE1C,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { logger } from '@powersync/lib-services-framework';
|
|
2
|
+
/**
|
|
3
|
+
* Track and log memory usage.
|
|
4
|
+
*
|
|
5
|
+
* Only for debugging purposes. This could add significant overhead and/or side-effects,
|
|
6
|
+
* and should not be used in production.
|
|
7
|
+
*/
|
|
8
|
+
export function trackMemoryUsage() {
|
|
9
|
+
let lastMem = process.memoryUsage();
|
|
10
|
+
let bufferMemory = {
|
|
11
|
+
alloc: 0,
|
|
12
|
+
allocUnsafe: 0,
|
|
13
|
+
allocUnsafeSlow: 0,
|
|
14
|
+
from: 0,
|
|
15
|
+
concat: 0
|
|
16
|
+
};
|
|
17
|
+
const bufferRegistry = new FinalizationRegistry((v) => {
|
|
18
|
+
const [key, value] = v;
|
|
19
|
+
bufferMemory[key] -= value;
|
|
20
|
+
});
|
|
21
|
+
for (let key of Object.keys(bufferMemory)) {
|
|
22
|
+
const typedKey = key;
|
|
23
|
+
const originalFunction = Buffer[typedKey];
|
|
24
|
+
Buffer[typedKey] = function (...args) {
|
|
25
|
+
const buffer = originalFunction.apply(this, args);
|
|
26
|
+
bufferMemory[typedKey] += buffer.byteLength;
|
|
27
|
+
bufferRegistry.register(buffer, [typedKey, buffer.byteLength]);
|
|
28
|
+
return buffer;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
setInterval(() => {
|
|
32
|
+
const mem = process.memoryUsage();
|
|
33
|
+
let isDifferent = false;
|
|
34
|
+
for (const key in mem) {
|
|
35
|
+
if (Math.abs(mem[key] - lastMem[key]) > 5000000) {
|
|
36
|
+
isDifferent = true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (isDifferent) {
|
|
40
|
+
lastMem = mem;
|
|
41
|
+
const output = `RSS ${mb(mem.rss)} (
|
|
42
|
+
HAT ${mb(mem.heapTotal)} (
|
|
43
|
+
HU ${mb(mem.heapUsed)}
|
|
44
|
+
),
|
|
45
|
+
buffers ${mb(mem.arrayBuffers)} (
|
|
46
|
+
alloc ${mb(bufferMemory.alloc + bufferMemory.allocUnsafe + bufferMemory.allocUnsafeSlow)},
|
|
47
|
+
from ${mb(bufferMemory.from)}
|
|
48
|
+
concat ${mb(bufferMemory.concat)}
|
|
49
|
+
)
|
|
50
|
+
)`.replaceAll(/\s+/g, ' ');
|
|
51
|
+
logger.info(output);
|
|
52
|
+
}
|
|
53
|
+
}, 50);
|
|
54
|
+
}
|
|
55
|
+
function mb(n) {
|
|
56
|
+
return Math.round(n / 1024 / 1024) + 'mb';
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=memory-tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-tracking.js","sourceRoot":"","sources":["../../src/util/memory-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,IAAI,YAAY,GAAG;QACjB,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,CAAC;QAClB,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;KACV,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,oBAAoB,CAAsC,CAAC,CAAC,EAAE,EAAE;QACzF,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,YAAY,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;QACzC,MAAM,QAAQ,GAAG,GAAgC,CAAC;QAClD,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAA+B,CAAC;QACxE,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,GAAG,IAAW;YACzC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAClD,YAAY,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC;YAC5C,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YAC/D,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;KACH;IAED,WAAW,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAElC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;YACrB,IAAI,IAAI,CAAC,GAAG,CAAE,GAAW,CAAC,GAAG,CAAC,GAAI,OAAe,CAAC,GAAG,CAAC,CAAC,GAAG,OAAS,EAAE;gBACnE,WAAW,GAAG,IAAI,CAAC;aACpB;SACF;QAED,IAAI,WAAW,EAAE;YACf,OAAO,GAAG,GAAG,CAAC;YAEd,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;cACzB,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;eAChB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;;kBAEb,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;kBACpB,EAAE,CAAC,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC,eAAe,CAAC;iBACjF,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;mBACnB,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;;QAElC,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAE3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACrB;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,EAAE,CAAC,CAAS;IACnB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as pgwire from '@powersync/service-jpgwire';
|
|
2
|
+
export type MigrationFunction = (db: pgwire.PgConnection) => Promise<void>;
|
|
3
|
+
export declare class Migrations {
|
|
4
|
+
private migrations;
|
|
5
|
+
add(id: number, name: string, up: MigrationFunction): void;
|
|
6
|
+
up(db: pgwire.PgConnection): Promise<void>;
|
|
7
|
+
getCurrentMigration(db: pgwire.PgConnection): Promise<{
|
|
8
|
+
id: number;
|
|
9
|
+
}>;
|
|
10
|
+
ensureMigrationsTable(db: pgwire.PgConnection): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Very loosely based on https://github.com/porsager/postgres-shift/
|
|
2
|
+
export class Migrations {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.migrations = [];
|
|
5
|
+
}
|
|
6
|
+
add(id, name, up) {
|
|
7
|
+
if (this.migrations.length > 0 && this.migrations[this.migrations.length - 1].id >= id) {
|
|
8
|
+
throw new Error('Migration ids must be strictly incrementing');
|
|
9
|
+
}
|
|
10
|
+
this.migrations.push({ id, up, name });
|
|
11
|
+
}
|
|
12
|
+
async up(db) {
|
|
13
|
+
await db.query('BEGIN');
|
|
14
|
+
try {
|
|
15
|
+
await this.ensureMigrationsTable(db);
|
|
16
|
+
const current = await this.getCurrentMigration(db);
|
|
17
|
+
let currentId = current ? current.id : 0;
|
|
18
|
+
for (let migration of this.migrations) {
|
|
19
|
+
if (migration.id <= currentId) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
await migration.up(db);
|
|
23
|
+
await db.query({
|
|
24
|
+
statement: `
|
|
25
|
+
insert into migrations (
|
|
26
|
+
migration_id,
|
|
27
|
+
name
|
|
28
|
+
) values (
|
|
29
|
+
$1,
|
|
30
|
+
$2
|
|
31
|
+
)
|
|
32
|
+
`,
|
|
33
|
+
params: [
|
|
34
|
+
{ type: 'int4', value: migration.id },
|
|
35
|
+
{ type: 'varchar', value: migration.name }
|
|
36
|
+
]
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
await db.query('COMMIT');
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
await db.query('ROLLBACK');
|
|
43
|
+
throw e;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
getCurrentMigration(db) {
|
|
47
|
+
return db
|
|
48
|
+
.query(`
|
|
49
|
+
select migration_id as id from migrations
|
|
50
|
+
order by migration_id desc
|
|
51
|
+
limit 1
|
|
52
|
+
`)
|
|
53
|
+
.then((results) => ({ id: results.rows[0][0] }));
|
|
54
|
+
}
|
|
55
|
+
async ensureMigrationsTable(db) {
|
|
56
|
+
await db.query(`create table if not exists migrations (
|
|
57
|
+
migration_id serial primary key,
|
|
58
|
+
created_at timestamp with time zone not null default now(),
|
|
59
|
+
name text
|
|
60
|
+
)
|
|
61
|
+
`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=migration_lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration_lib.js","sourceRoot":"","sources":["../../src/util/migration_lib.ts"],"names":[],"mappings":"AAUA,oEAAoE;AACpE,MAAM,OAAO,UAAU;IAAvB;QACU,eAAU,GAAgB,EAAE,CAAC;IAkEvC,CAAC;IAhEC,GAAG,CAAC,EAAU,EAAE,IAAY,EAAE,EAAqB;QACjD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;YACtF,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAChE;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,EAAE,CAAC,EAAuB;QAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI;YACF,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YACnD,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,KAAK,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;gBACrC,IAAI,SAAS,CAAC,EAAE,IAAI,SAAS,EAAE;oBAC7B,SAAS;iBACV;gBACD,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAEvB,MAAM,EAAE,CAAC,KAAK,CAAC;oBACb,SAAS,EAAE;;;;;;;;KAQhB;oBACK,MAAM,EAAE;wBACN,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE;wBACrC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE;qBAC3C;iBACF,CAAC,CAAC;aACJ;YAED,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;SAC1B;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC3B,MAAM,CAAC,CAAC;SACT;IACH,CAAC;IAED,mBAAmB,CAAC,EAAuB;QACzC,OAAO,EAAE;aACN,KAAK,CACJ;;;;KAIH,CACE;aACA,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,EAAuB;QACjD,MAAM,EAAE,CAAC,KAAK,CAAC;;;;;KAKd,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as bson from 'bson';
|
|
2
|
+
import * as pgwire from '@powersync/service-jpgwire';
|
|
3
|
+
import { SqliteJsonValue, SqliteRow, ToastableSqliteRow } from '@powersync/service-sync-rules';
|
|
4
|
+
import * as replication from '../replication/replication-index.js';
|
|
5
|
+
/**
|
|
6
|
+
* pgwire message -> SQLite row.
|
|
7
|
+
* @param message
|
|
8
|
+
*/
|
|
9
|
+
export declare function constructAfterRecord(message: pgwire.PgoutputInsert | pgwire.PgoutputUpdate): SqliteRow;
|
|
10
|
+
export declare function hasToastedValues(row: ToastableSqliteRow): boolean;
|
|
11
|
+
export declare function isCompleteRow(row: ToastableSqliteRow): row is SqliteRow;
|
|
12
|
+
/**
|
|
13
|
+
* pgwire message -> SQLite row.
|
|
14
|
+
* @param message
|
|
15
|
+
*/
|
|
16
|
+
export declare function constructBeforeRecord(message: pgwire.PgoutputDelete | pgwire.PgoutputUpdate): SqliteRow | undefined;
|
|
17
|
+
export declare function getUuidReplicaIdentityString(tuple: ToastableSqliteRow, columns: replication.ReplicationColumn[]): string;
|
|
18
|
+
export declare function uuidForRow(row: SqliteRow): string;
|
|
19
|
+
export declare function getUuidReplicaIdentityBson(tuple: ToastableSqliteRow, columns: replication.ReplicationColumn[]): bson.UUID;
|
|
20
|
+
export declare function uuidForRowBson(row: SqliteRow): bson.UUID;
|
|
21
|
+
export declare function escapeIdentifier(identifier: string): string;
|
|
22
|
+
export declare function autoParameter(arg: SqliteJsonValue | boolean): pgwire.StatementParam;
|
|
23
|
+
export declare function retriedQuery(db: pgwire.PgClient, ...statements: pgwire.Statement[]): Promise<pgwire.PgResult>;
|
|
24
|
+
export declare function retriedQuery(db: pgwire.PgClient, query: string): Promise<pgwire.PgResult>;
|