@dotdo/postgres 0.1.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/README.md +868 -0
- package/dist/cdc/change-stream.d.ts +44 -0
- package/dist/cdc/change-stream.d.ts.map +1 -0
- package/dist/cdc/change-stream.js +95 -0
- package/dist/cdc/change-stream.js.map +1 -0
- package/dist/cdc/filter.d.ts +58 -0
- package/dist/cdc/filter.d.ts.map +1 -0
- package/dist/cdc/filter.js +520 -0
- package/dist/cdc/filter.js.map +1 -0
- package/dist/cdc/index.d.ts +47 -0
- package/dist/cdc/index.d.ts.map +1 -0
- package/dist/cdc/index.js +50 -0
- package/dist/cdc/index.js.map +1 -0
- package/dist/cdc/resume-token.d.ts +60 -0
- package/dist/cdc/resume-token.d.ts.map +1 -0
- package/dist/cdc/resume-token.js +228 -0
- package/dist/cdc/resume-token.js.map +1 -0
- package/dist/cdc/transport/index.d.ts +7 -0
- package/dist/cdc/transport/index.d.ts.map +1 -0
- package/dist/cdc/transport/index.js +7 -0
- package/dist/cdc/transport/index.js.map +1 -0
- package/dist/cdc/transport/sse.d.ts +120 -0
- package/dist/cdc/transport/sse.d.ts.map +1 -0
- package/dist/cdc/transport/sse.js +590 -0
- package/dist/cdc/transport/sse.js.map +1 -0
- package/dist/cdc/transport/websocket.d.ts +130 -0
- package/dist/cdc/transport/websocket.d.ts.map +1 -0
- package/dist/cdc/transport/websocket.js +688 -0
- package/dist/cdc/transport/websocket.js.map +1 -0
- package/dist/cdc/types.d.ts +306 -0
- package/dist/cdc/types.d.ts.map +1 -0
- package/dist/cdc/types.js +8 -0
- package/dist/cdc/types.js.map +1 -0
- package/dist/config/index.d.ts +25 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +25 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/memory.d.ts +139 -0
- package/dist/config/memory.d.ts.map +1 -0
- package/dist/config/memory.js +157 -0
- package/dist/config/memory.js.map +1 -0
- package/dist/config/storage.d.ts +157 -0
- package/dist/config/storage.d.ts.map +1 -0
- package/dist/config/storage.js +178 -0
- package/dist/config/storage.js.map +1 -0
- package/dist/config/streaming.d.ts +117 -0
- package/dist/config/streaming.d.ts.map +1 -0
- package/dist/config/streaming.js +132 -0
- package/dist/config/streaming.js.map +1 -0
- package/dist/config/timeouts.d.ts +168 -0
- package/dist/config/timeouts.d.ts.map +1 -0
- package/dist/config/timeouts.js +192 -0
- package/dist/config/timeouts.js.map +1 -0
- package/dist/extensions/config.d.ts +89 -0
- package/dist/extensions/config.d.ts.map +1 -0
- package/dist/extensions/config.js +216 -0
- package/dist/extensions/config.js.map +1 -0
- package/dist/extensions/geo.d.ts +452 -0
- package/dist/extensions/geo.d.ts.map +1 -0
- package/dist/extensions/geo.js +583 -0
- package/dist/extensions/geo.js.map +1 -0
- package/dist/extensions/index.d.ts +167 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +99 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +226 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +456 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/pgmq-lite.d.ts +330 -0
- package/dist/extensions/pgmq-lite.d.ts.map +1 -0
- package/dist/extensions/pgmq-lite.js +648 -0
- package/dist/extensions/pgmq-lite.js.map +1 -0
- package/dist/extensions/plugins.d.ts +260 -0
- package/dist/extensions/plugins.d.ts.map +1 -0
- package/dist/extensions/plugins.js +535 -0
- package/dist/extensions/plugins.js.map +1 -0
- package/dist/extensions/registry.d.ts +93 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +182 -0
- package/dist/extensions/registry.js.map +1 -0
- package/dist/extensions/vector.d.ts +106 -0
- package/dist/extensions/vector.d.ts.map +1 -0
- package/dist/extensions/vector.js +129 -0
- package/dist/extensions/vector.js.map +1 -0
- package/dist/iceberg/analytics.d.ts +279 -0
- package/dist/iceberg/analytics.d.ts.map +1 -0
- package/dist/iceberg/analytics.js +448 -0
- package/dist/iceberg/analytics.js.map +1 -0
- package/dist/iceberg/catalog-api.d.ts +39 -0
- package/dist/iceberg/catalog-api.d.ts.map +1 -0
- package/dist/iceberg/catalog-api.js +388 -0
- package/dist/iceberg/catalog-api.js.map +1 -0
- package/dist/iceberg/catalog.d.ts +401 -0
- package/dist/iceberg/catalog.d.ts.map +1 -0
- package/dist/iceberg/catalog.js +677 -0
- package/dist/iceberg/catalog.js.map +1 -0
- package/dist/iceberg/duckdb-wasm.d.ts +447 -0
- package/dist/iceberg/duckdb-wasm.d.ts.map +1 -0
- package/dist/iceberg/duckdb-wasm.js +600 -0
- package/dist/iceberg/duckdb-wasm.js.map +1 -0
- package/dist/iceberg/index.d.ts +92 -0
- package/dist/iceberg/index.d.ts.map +1 -0
- package/dist/iceberg/index.js +119 -0
- package/dist/iceberg/index.js.map +1 -0
- package/dist/iceberg/metadata.d.ts +214 -0
- package/dist/iceberg/metadata.d.ts.map +1 -0
- package/dist/iceberg/metadata.js +535 -0
- package/dist/iceberg/metadata.js.map +1 -0
- package/dist/iceberg/optimizer.d.ts +296 -0
- package/dist/iceberg/optimizer.d.ts.map +1 -0
- package/dist/iceberg/optimizer.js +889 -0
- package/dist/iceberg/optimizer.js.map +1 -0
- package/dist/iceberg/parquet.d.ts +447 -0
- package/dist/iceberg/parquet.d.ts.map +1 -0
- package/dist/iceberg/parquet.js +1225 -0
- package/dist/iceberg/parquet.js.map +1 -0
- package/dist/iceberg/r2-organization.d.ts +422 -0
- package/dist/iceberg/r2-organization.d.ts.map +1 -0
- package/dist/iceberg/r2-organization.js +672 -0
- package/dist/iceberg/r2-organization.js.map +1 -0
- package/dist/iceberg/scheduler-do-example.d.ts +158 -0
- package/dist/iceberg/scheduler-do-example.d.ts.map +1 -0
- package/dist/iceberg/scheduler-do-example.js +261 -0
- package/dist/iceberg/scheduler-do-example.js.map +1 -0
- package/dist/iceberg/scheduler.d.ts +434 -0
- package/dist/iceberg/scheduler.d.ts.map +1 -0
- package/dist/iceberg/scheduler.js +818 -0
- package/dist/iceberg/scheduler.js.map +1 -0
- package/dist/iceberg/schema.d.ts +149 -0
- package/dist/iceberg/schema.d.ts.map +1 -0
- package/dist/iceberg/schema.js +525 -0
- package/dist/iceberg/schema.js.map +1 -0
- package/dist/iceberg/snapshot-manager.d.ts +406 -0
- package/dist/iceberg/snapshot-manager.d.ts.map +1 -0
- package/dist/iceberg/snapshot-manager.js +934 -0
- package/dist/iceberg/snapshot-manager.js.map +1 -0
- package/dist/iceberg/sql-router.d.ts +194 -0
- package/dist/iceberg/sql-router.d.ts.map +1 -0
- package/dist/iceberg/sql-router.js +180 -0
- package/dist/iceberg/sql-router.js.map +1 -0
- package/dist/iceberg/test-fixtures.d.ts +151 -0
- package/dist/iceberg/test-fixtures.d.ts.map +1 -0
- package/dist/iceberg/test-fixtures.js +446 -0
- package/dist/iceberg/test-fixtures.js.map +1 -0
- package/dist/iceberg/time-travel-api.d.ts +102 -0
- package/dist/iceberg/time-travel-api.d.ts.map +1 -0
- package/dist/iceberg/time-travel-api.js +437 -0
- package/dist/iceberg/time-travel-api.js.map +1 -0
- package/dist/iceberg/time-travel.d.ts +293 -0
- package/dist/iceberg/time-travel.d.ts.map +1 -0
- package/dist/iceberg/time-travel.js +689 -0
- package/dist/iceberg/time-travel.js.map +1 -0
- package/dist/iceberg/transformer.d.ts +356 -0
- package/dist/iceberg/transformer.d.ts.map +1 -0
- package/dist/iceberg/transformer.js +770 -0
- package/dist/iceberg/transformer.js.map +1 -0
- package/dist/iceberg/types.d.ts +318 -0
- package/dist/iceberg/types.d.ts.map +1 -0
- package/dist/iceberg/types.js +9 -0
- package/dist/iceberg/types.js.map +1 -0
- package/dist/iceberg/writer.d.ts +144 -0
- package/dist/iceberg/writer.d.ts.map +1 -0
- package/dist/iceberg/writer.js +452 -0
- package/dist/iceberg/writer.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/lineage/index.d.ts +11 -0
- package/dist/lineage/index.d.ts.map +1 -0
- package/dist/lineage/index.js +11 -0
- package/dist/lineage/index.js.map +1 -0
- package/dist/lineage/integration.d.ts +134 -0
- package/dist/lineage/integration.d.ts.map +1 -0
- package/dist/lineage/integration.js +258 -0
- package/dist/lineage/integration.js.map +1 -0
- package/dist/lineage/tracker.d.ts +189 -0
- package/dist/lineage/tracker.d.ts.map +1 -0
- package/dist/lineage/tracker.js +1352 -0
- package/dist/lineage/tracker.js.map +1 -0
- package/dist/lineage/types.d.ts +318 -0
- package/dist/lineage/types.d.ts.map +1 -0
- package/dist/lineage/types.js +9 -0
- package/dist/lineage/types.js.map +1 -0
- package/dist/middleware/index.d.ts +11 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +16 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +397 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +507 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/migration-tooling/external-migration.d.ts +601 -0
- package/dist/migration-tooling/external-migration.d.ts.map +1 -0
- package/dist/migration-tooling/external-migration.js +1612 -0
- package/dist/migration-tooling/external-migration.js.map +1 -0
- package/dist/migration-tooling/index.d.ts +19 -0
- package/dist/migration-tooling/index.d.ts.map +1 -0
- package/dist/migration-tooling/index.js +19 -0
- package/dist/migration-tooling/index.js.map +1 -0
- package/dist/migrations/auto-migrator.d.ts +289 -0
- package/dist/migrations/auto-migrator.d.ts.map +1 -0
- package/dist/migrations/auto-migrator.js +396 -0
- package/dist/migrations/auto-migrator.js.map +1 -0
- package/dist/migrations/bulk-orchestrator.d.ts +403 -0
- package/dist/migrations/bulk-orchestrator.d.ts.map +1 -0
- package/dist/migrations/bulk-orchestrator.js +646 -0
- package/dist/migrations/bulk-orchestrator.js.map +1 -0
- package/dist/migrations/compatibility.d.ts +216 -0
- package/dist/migrations/compatibility.d.ts.map +1 -0
- package/dist/migrations/compatibility.js +651 -0
- package/dist/migrations/compatibility.js.map +1 -0
- package/dist/migrations/do-migrations.d.ts +101 -0
- package/dist/migrations/do-migrations.d.ts.map +1 -0
- package/dist/migrations/do-migrations.js +1060 -0
- package/dist/migrations/do-migrations.js.map +1 -0
- package/dist/migrations/do-migrations.types.d.ts +550 -0
- package/dist/migrations/do-migrations.types.d.ts.map +1 -0
- package/dist/migrations/do-migrations.types.js +15 -0
- package/dist/migrations/do-migrations.types.js.map +1 -0
- package/dist/migrations/drizzle-compat.d.ts +163 -0
- package/dist/migrations/drizzle-compat.d.ts.map +1 -0
- package/dist/migrations/drizzle-compat.js +273 -0
- package/dist/migrations/drizzle-compat.js.map +1 -0
- package/dist/migrations/index.d.ts +109 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +127 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/migration-api.d.ts +161 -0
- package/dist/migrations/migration-api.d.ts.map +1 -0
- package/dist/migrations/migration-api.js +499 -0
- package/dist/migrations/migration-api.js.map +1 -0
- package/dist/migrations/progress-tracker-do.d.ts +195 -0
- package/dist/migrations/progress-tracker-do.d.ts.map +1 -0
- package/dist/migrations/progress-tracker-do.js +339 -0
- package/dist/migrations/progress-tracker-do.js.map +1 -0
- package/dist/migrations/progress-tracker-kv.d.ts +103 -0
- package/dist/migrations/progress-tracker-kv.d.ts.map +1 -0
- package/dist/migrations/progress-tracker-kv.js +231 -0
- package/dist/migrations/progress-tracker-kv.js.map +1 -0
- package/dist/migrations/progress-tracker.d.ts +320 -0
- package/dist/migrations/progress-tracker.d.ts.map +1 -0
- package/dist/migrations/progress-tracker.js +443 -0
- package/dist/migrations/progress-tracker.js.map +1 -0
- package/dist/migrations/registry.d.ts +231 -0
- package/dist/migrations/registry.d.ts.map +1 -0
- package/dist/migrations/registry.js +376 -0
- package/dist/migrations/registry.js.map +1 -0
- package/dist/migrations/runner.d.ts +197 -0
- package/dist/migrations/runner.d.ts.map +1 -0
- package/dist/migrations/runner.js +1167 -0
- package/dist/migrations/runner.js.map +1 -0
- package/dist/migrations/schema-generator.d.ts +111 -0
- package/dist/migrations/schema-generator.d.ts.map +1 -0
- package/dist/migrations/schema-generator.js +335 -0
- package/dist/migrations/schema-generator.js.map +1 -0
- package/dist/migrations/testing.d.ts +321 -0
- package/dist/migrations/testing.d.ts.map +1 -0
- package/dist/migrations/testing.js +645 -0
- package/dist/migrations/testing.js.map +1 -0
- package/dist/migrations/types.d.ts +503 -0
- package/dist/migrations/types.d.ts.map +1 -0
- package/dist/migrations/types.js +11 -0
- package/dist/migrations/types.js.map +1 -0
- package/dist/migrations/validator.d.ts +215 -0
- package/dist/migrations/validator.d.ts.map +1 -0
- package/dist/migrations/validator.js +494 -0
- package/dist/migrations/validator.js.map +1 -0
- package/dist/observability/alerting.d.ts +116 -0
- package/dist/observability/alerting.d.ts.map +1 -0
- package/dist/observability/alerting.js +353 -0
- package/dist/observability/alerting.js.map +1 -0
- package/dist/observability/analytics-engine.d.ts +357 -0
- package/dist/observability/analytics-engine.d.ts.map +1 -0
- package/dist/observability/analytics-engine.js +430 -0
- package/dist/observability/analytics-engine.js.map +1 -0
- package/dist/observability/cost-metrics.d.ts +269 -0
- package/dist/observability/cost-metrics.d.ts.map +1 -0
- package/dist/observability/cost-metrics.js +560 -0
- package/dist/observability/cost-metrics.js.map +1 -0
- package/dist/observability/cross-do-tracing.d.ts +305 -0
- package/dist/observability/cross-do-tracing.d.ts.map +1 -0
- package/dist/observability/cross-do-tracing.js +431 -0
- package/dist/observability/cross-do-tracing.js.map +1 -0
- package/dist/observability/error-rate-collector.d.ts +163 -0
- package/dist/observability/error-rate-collector.d.ts.map +1 -0
- package/dist/observability/error-rate-collector.js +306 -0
- package/dist/observability/error-rate-collector.js.map +1 -0
- package/dist/observability/exporters.d.ts +231 -0
- package/dist/observability/exporters.d.ts.map +1 -0
- package/dist/observability/exporters.js +479 -0
- package/dist/observability/exporters.js.map +1 -0
- package/dist/observability/health-check.d.ts +106 -0
- package/dist/observability/health-check.d.ts.map +1 -0
- package/dist/observability/health-check.js +243 -0
- package/dist/observability/health-check.js.map +1 -0
- package/dist/observability/index.d.ts +297 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +455 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/instrumentation.d.ts +222 -0
- package/dist/observability/instrumentation.d.ts.map +1 -0
- package/dist/observability/instrumentation.js +532 -0
- package/dist/observability/instrumentation.js.map +1 -0
- package/dist/observability/memory-metrics.d.ts +227 -0
- package/dist/observability/memory-metrics.d.ts.map +1 -0
- package/dist/observability/memory-metrics.js +688 -0
- package/dist/observability/memory-metrics.js.map +1 -0
- package/dist/observability/metrics-endpoint.d.ts +91 -0
- package/dist/observability/metrics-endpoint.d.ts.map +1 -0
- package/dist/observability/metrics-endpoint.js +246 -0
- package/dist/observability/metrics-endpoint.js.map +1 -0
- package/dist/observability/metrics.d.ts +88 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +253 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/observability-features.d.ts +488 -0
- package/dist/observability/observability-features.d.ts.map +1 -0
- package/dist/observability/observability-features.js +773 -0
- package/dist/observability/observability-features.js.map +1 -0
- package/dist/observability/prometheus.d.ts +39 -0
- package/dist/observability/prometheus.d.ts.map +1 -0
- package/dist/observability/prometheus.js +120 -0
- package/dist/observability/prometheus.js.map +1 -0
- package/dist/observability/propagation.d.ts +126 -0
- package/dist/observability/propagation.d.ts.map +1 -0
- package/dist/observability/propagation.js +234 -0
- package/dist/observability/propagation.js.map +1 -0
- package/dist/observability/query-latency.d.ts +243 -0
- package/dist/observability/query-latency.d.ts.map +1 -0
- package/dist/observability/query-latency.js +292 -0
- package/dist/observability/query-latency.js.map +1 -0
- package/dist/observability/query-performance.d.ts +169 -0
- package/dist/observability/query-performance.d.ts.map +1 -0
- package/dist/observability/query-performance.js +290 -0
- package/dist/observability/query-performance.js.map +1 -0
- package/dist/observability/storage-tier-metrics.d.ts +174 -0
- package/dist/observability/storage-tier-metrics.d.ts.map +1 -0
- package/dist/observability/storage-tier-metrics.js +306 -0
- package/dist/observability/storage-tier-metrics.js.map +1 -0
- package/dist/observability/tier-cost-optimizer.d.ts +155 -0
- package/dist/observability/tier-cost-optimizer.d.ts.map +1 -0
- package/dist/observability/tier-cost-optimizer.js +536 -0
- package/dist/observability/tier-cost-optimizer.js.map +1 -0
- package/dist/observability/tracer.d.ts +149 -0
- package/dist/observability/tracer.d.ts.map +1 -0
- package/dist/observability/tracer.js +435 -0
- package/dist/observability/tracer.js.map +1 -0
- package/dist/observability/types.d.ts +402 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +103 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/pglite/workers-pglite.d.ts +138 -0
- package/dist/pglite/workers-pglite.d.ts.map +1 -0
- package/dist/pglite/workers-pglite.js +143 -0
- package/dist/pglite/workers-pglite.js.map +1 -0
- package/dist/pglite-assets/pglite.data +0 -0
- package/dist/pglite-assets/pglite.wasm +0 -0
- package/dist/playground/index.d.ts +52 -0
- package/dist/playground/index.d.ts.map +1 -0
- package/dist/playground/index.js +55 -0
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/keyboard-shortcuts.d.ts +116 -0
- package/dist/playground/keyboard-shortcuts.d.ts.map +1 -0
- package/dist/playground/keyboard-shortcuts.js +588 -0
- package/dist/playground/keyboard-shortcuts.js.map +1 -0
- package/dist/playground/playground.d.ts +82 -0
- package/dist/playground/playground.d.ts.map +1 -0
- package/dist/playground/playground.js +271 -0
- package/dist/playground/playground.js.map +1 -0
- package/dist/playground/query-executor.d.ts +115 -0
- package/dist/playground/query-executor.d.ts.map +1 -0
- package/dist/playground/query-executor.js +558 -0
- package/dist/playground/query-executor.js.map +1 -0
- package/dist/playground/query-history.d.ts +92 -0
- package/dist/playground/query-history.d.ts.map +1 -0
- package/dist/playground/query-history.js +259 -0
- package/dist/playground/query-history.js.map +1 -0
- package/dist/playground/result-formatter.d.ts +59 -0
- package/dist/playground/result-formatter.d.ts.map +1 -0
- package/dist/playground/result-formatter.js +341 -0
- package/dist/playground/result-formatter.js.map +1 -0
- package/dist/playground/sample-datasets.d.ts +77 -0
- package/dist/playground/sample-datasets.d.ts.map +1 -0
- package/dist/playground/sample-datasets.js +641 -0
- package/dist/playground/sample-datasets.js.map +1 -0
- package/dist/playground/sample-queries.d.ts +73 -0
- package/dist/playground/sample-queries.d.ts.map +1 -0
- package/dist/playground/sample-queries.js +1095 -0
- package/dist/playground/sample-queries.js.map +1 -0
- package/dist/playground/schema-explorer.d.ts +55 -0
- package/dist/playground/schema-explorer.d.ts.map +1 -0
- package/dist/playground/schema-explorer.js +473 -0
- package/dist/playground/schema-explorer.js.map +1 -0
- package/dist/playground/types.d.ts +430 -0
- package/dist/playground/types.d.ts.map +1 -0
- package/dist/playground/types.js +10 -0
- package/dist/playground/types.js.map +1 -0
- package/dist/readonly/cache-reader.d.ts +145 -0
- package/dist/readonly/cache-reader.d.ts.map +1 -0
- package/dist/readonly/cache-reader.js +198 -0
- package/dist/readonly/cache-reader.js.map +1 -0
- package/dist/readonly/config.d.ts +74 -0
- package/dist/readonly/config.d.ts.map +1 -0
- package/dist/readonly/config.js +67 -0
- package/dist/readonly/config.js.map +1 -0
- package/dist/readonly/index.d.ts +22 -0
- package/dist/readonly/index.d.ts.map +1 -0
- package/dist/readonly/index.js +17 -0
- package/dist/readonly/index.js.map +1 -0
- package/dist/readonly/pglite-wrapper.d.ts +82 -0
- package/dist/readonly/pglite-wrapper.d.ts.map +1 -0
- package/dist/readonly/pglite-wrapper.js +123 -0
- package/dist/readonly/pglite-wrapper.js.map +1 -0
- package/dist/readonly/worker.d.ts +142 -0
- package/dist/readonly/worker.d.ts.map +1 -0
- package/dist/readonly/worker.js +187 -0
- package/dist/readonly/worker.js.map +1 -0
- package/dist/readonly/write-blocker.d.ts +47 -0
- package/dist/readonly/write-blocker.d.ts.map +1 -0
- package/dist/readonly/write-blocker.js +136 -0
- package/dist/readonly/write-blocker.js.map +1 -0
- package/dist/recovery/disaster-recovery.d.ts +326 -0
- package/dist/recovery/disaster-recovery.d.ts.map +1 -0
- package/dist/recovery/disaster-recovery.js +799 -0
- package/dist/recovery/disaster-recovery.js.map +1 -0
- package/dist/recovery/index.d.ts +12 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +12 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/recovery/parquet-parser.d.ts +321 -0
- package/dist/recovery/parquet-parser.d.ts.map +1 -0
- package/dist/recovery/parquet-parser.js +797 -0
- package/dist/recovery/parquet-parser.js.map +1 -0
- package/dist/retention/index.d.ts +50 -0
- package/dist/retention/index.d.ts.map +1 -0
- package/dist/retention/index.js +50 -0
- package/dist/retention/index.js.map +1 -0
- package/dist/retention/policy.d.ts +344 -0
- package/dist/retention/policy.d.ts.map +1 -0
- package/dist/retention/policy.js +472 -0
- package/dist/retention/policy.js.map +1 -0
- package/dist/retention/purger.d.ts +187 -0
- package/dist/retention/purger.d.ts.map +1 -0
- package/dist/retention/purger.js +411 -0
- package/dist/retention/purger.js.map +1 -0
- package/dist/rls/auth-integration.d.ts +280 -0
- package/dist/rls/auth-integration.d.ts.map +1 -0
- package/dist/rls/auth-integration.js +399 -0
- package/dist/rls/auth-integration.js.map +1 -0
- package/dist/rls/generator.d.ts +249 -0
- package/dist/rls/generator.d.ts.map +1 -0
- package/dist/rls/generator.js +495 -0
- package/dist/rls/generator.js.map +1 -0
- package/dist/rls/index.d.ts +26 -0
- package/dist/rls/index.d.ts.map +1 -0
- package/dist/rls/index.js +58 -0
- package/dist/rls/index.js.map +1 -0
- package/dist/rls/policy.d.ts +116 -0
- package/dist/rls/policy.d.ts.map +1 -0
- package/dist/rls/policy.js +77 -0
- package/dist/rls/policy.js.map +1 -0
- package/dist/rls/validator.d.ts +155 -0
- package/dist/rls/validator.d.ts.map +1 -0
- package/dist/rls/validator.js +792 -0
- package/dist/rls/validator.js.map +1 -0
- package/dist/routing/adaptive-router.d.ts +317 -0
- package/dist/routing/adaptive-router.d.ts.map +1 -0
- package/dist/routing/adaptive-router.js +554 -0
- package/dist/routing/adaptive-router.js.map +1 -0
- package/dist/routing/circuit-breaker.d.ts +339 -0
- package/dist/routing/circuit-breaker.d.ts.map +1 -0
- package/dist/routing/circuit-breaker.js +620 -0
- package/dist/routing/circuit-breaker.js.map +1 -0
- package/dist/routing/cost-metrics.d.ts +133 -0
- package/dist/routing/cost-metrics.d.ts.map +1 -0
- package/dist/routing/cost-metrics.js +259 -0
- package/dist/routing/cost-metrics.js.map +1 -0
- package/dist/routing/do-connection-pool.d.ts +243 -0
- package/dist/routing/do-connection-pool.d.ts.map +1 -0
- package/dist/routing/do-connection-pool.js +572 -0
- package/dist/routing/do-connection-pool.js.map +1 -0
- package/dist/routing/index.d.ts +59 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +59 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/query-complexity-estimator.d.ts +73 -0
- package/dist/routing/query-complexity-estimator.d.ts.map +1 -0
- package/dist/routing/query-complexity-estimator.js +327 -0
- package/dist/routing/query-complexity-estimator.js.map +1 -0
- package/dist/routing/request-coalescing.d.ts +178 -0
- package/dist/routing/request-coalescing.d.ts.map +1 -0
- package/dist/routing/request-coalescing.js +325 -0
- package/dist/routing/request-coalescing.js.map +1 -0
- package/dist/routing/runtime-router.d.ts +107 -0
- package/dist/routing/runtime-router.d.ts.map +1 -0
- package/dist/routing/runtime-router.js +246 -0
- package/dist/routing/runtime-router.js.map +1 -0
- package/dist/routing/tenant-router.d.ts +848 -0
- package/dist/routing/tenant-router.d.ts.map +1 -0
- package/dist/routing/tenant-router.js +1056 -0
- package/dist/routing/tenant-router.js.map +1 -0
- package/dist/routing/websocket-pool.d.ts +119 -0
- package/dist/routing/websocket-pool.d.ts.map +1 -0
- package/dist/routing/websocket-pool.js +436 -0
- package/dist/routing/websocket-pool.js.map +1 -0
- package/dist/storage/cache-layer.d.ts +159 -0
- package/dist/storage/cache-layer.d.ts.map +1 -0
- package/dist/storage/cache-layer.js +245 -0
- package/dist/storage/cache-layer.js.map +1 -0
- package/dist/storage/cost-aware-tiering.d.ts +258 -0
- package/dist/storage/cost-aware-tiering.d.ts.map +1 -0
- package/dist/storage/cost-aware-tiering.js +526 -0
- package/dist/storage/cost-aware-tiering.js.map +1 -0
- package/dist/storage/index.d.ts +87 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +78 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/interfaces.d.ts +856 -0
- package/dist/storage/interfaces.d.ts.map +1 -0
- package/dist/storage/interfaces.js +69 -0
- package/dist/storage/interfaces.js.map +1 -0
- package/dist/storage/r2-layer.d.ts +226 -0
- package/dist/storage/r2-layer.d.ts.map +1 -0
- package/dist/storage/r2-layer.js +307 -0
- package/dist/storage/r2-layer.js.map +1 -0
- package/dist/storage/r2-overflow.d.ts +344 -0
- package/dist/storage/r2-overflow.d.ts.map +1 -0
- package/dist/storage/r2-overflow.js +730 -0
- package/dist/storage/r2-overflow.js.map +1 -0
- package/dist/storage/r2-page-vfs.d.ts +374 -0
- package/dist/storage/r2-page-vfs.d.ts.map +1 -0
- package/dist/storage/r2-page-vfs.js +754 -0
- package/dist/storage/r2-page-vfs.js.map +1 -0
- package/dist/storage/swr-cache.d.ts +181 -0
- package/dist/storage/swr-cache.d.ts.map +1 -0
- package/dist/storage/swr-cache.js +295 -0
- package/dist/storage/swr-cache.js.map +1 -0
- package/dist/storage/tiered-orchestrator.d.ts +951 -0
- package/dist/storage/tiered-orchestrator.d.ts.map +1 -0
- package/dist/storage/tiered-orchestrator.js +1731 -0
- package/dist/storage/tiered-orchestrator.js.map +1 -0
- package/dist/storage/tiered-vfs-swr.d.ts +279 -0
- package/dist/storage/tiered-vfs-swr.d.ts.map +1 -0
- package/dist/storage/tiered-vfs-swr.js +584 -0
- package/dist/storage/tiered-vfs-swr.js.map +1 -0
- package/dist/storage/tiered-vfs.d.ts +405 -0
- package/dist/storage/tiered-vfs.d.ts.map +1 -0
- package/dist/storage/tiered-vfs.js +833 -0
- package/dist/storage/tiered-vfs.js.map +1 -0
- package/dist/streaming/backpressure-controller.d.ts +173 -0
- package/dist/streaming/backpressure-controller.d.ts.map +1 -0
- package/dist/streaming/backpressure-controller.js +344 -0
- package/dist/streaming/backpressure-controller.js.map +1 -0
- package/dist/streaming/buffer-pool.d.ts +241 -0
- package/dist/streaming/buffer-pool.d.ts.map +1 -0
- package/dist/streaming/buffer-pool.js +381 -0
- package/dist/streaming/buffer-pool.js.map +1 -0
- package/dist/streaming/cdc-iceberg-connector.d.ts +272 -0
- package/dist/streaming/cdc-iceberg-connector.d.ts.map +1 -0
- package/dist/streaming/cdc-iceberg-connector.js +408 -0
- package/dist/streaming/cdc-iceberg-connector.js.map +1 -0
- package/dist/streaming/index.d.ts +111 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +128 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming/live-cdc-stream.d.ts +400 -0
- package/dist/streaming/live-cdc-stream.d.ts.map +1 -0
- package/dist/streaming/live-cdc-stream.js +703 -0
- package/dist/streaming/live-cdc-stream.js.map +1 -0
- package/dist/streaming/memory-bounded-stream.d.ts +207 -0
- package/dist/streaming/memory-bounded-stream.d.ts.map +1 -0
- package/dist/streaming/memory-bounded-stream.js +340 -0
- package/dist/streaming/memory-bounded-stream.js.map +1 -0
- package/dist/streaming/query-streamer.d.ts +379 -0
- package/dist/streaming/query-streamer.d.ts.map +1 -0
- package/dist/streaming/query-streamer.js +495 -0
- package/dist/streaming/query-streamer.js.map +1 -0
- package/dist/streaming/response-streaming.d.ts +203 -0
- package/dist/streaming/response-streaming.d.ts.map +1 -0
- package/dist/streaming/response-streaming.js +449 -0
- package/dist/streaming/response-streaming.js.map +1 -0
- package/dist/types/branded.d.ts +859 -0
- package/dist/types/branded.d.ts.map +1 -0
- package/dist/types/branded.js +891 -0
- package/dist/types/branded.js.map +1 -0
- package/dist/types/utilities.d.ts +757 -0
- package/dist/types/utilities.d.ts.map +1 -0
- package/dist/types/utilities.js +447 -0
- package/dist/types/utilities.js.map +1 -0
- package/dist/wal/replay-engine.d.ts +344 -0
- package/dist/wal/replay-engine.d.ts.map +1 -0
- package/dist/wal/replay-engine.js +975 -0
- package/dist/wal/replay-engine.js.map +1 -0
- package/dist/worker/__mocks__/capnweb.d.ts +13 -0
- package/dist/worker/__mocks__/capnweb.d.ts.map +1 -0
- package/dist/worker/__mocks__/capnweb.js +15 -0
- package/dist/worker/__mocks__/capnweb.js.map +1 -0
- package/dist/worker/__mocks__/cloudflare-workers.d.ts +31 -0
- package/dist/worker/__mocks__/cloudflare-workers.d.ts.map +1 -0
- package/dist/worker/__mocks__/cloudflare-workers.js +33 -0
- package/dist/worker/__mocks__/cloudflare-workers.js.map +1 -0
- package/dist/worker/__mocks__/pglite.data.d.ts +3 -0
- package/dist/worker/__mocks__/pglite.data.d.ts.map +1 -0
- package/dist/worker/__mocks__/pglite.data.js +20 -0
- package/dist/worker/__mocks__/pglite.data.js.map +1 -0
- package/dist/worker/__mocks__/pglite.wasm.d.ts +3 -0
- package/dist/worker/__mocks__/pglite.wasm.d.ts.map +1 -0
- package/dist/worker/__mocks__/pglite.wasm.js +30 -0
- package/dist/worker/__mocks__/pglite.wasm.js.map +1 -0
- package/dist/worker/auth-rate-limiter.d.ts +270 -0
- package/dist/worker/auth-rate-limiter.d.ts.map +1 -0
- package/dist/worker/auth-rate-limiter.js +332 -0
- package/dist/worker/auth-rate-limiter.js.map +1 -0
- package/dist/worker/auth.d.ts +345 -0
- package/dist/worker/auth.d.ts.map +1 -0
- package/dist/worker/auth.js +837 -0
- package/dist/worker/auth.js.map +1 -0
- package/dist/worker/cdc-backpressure.d.ts +338 -0
- package/dist/worker/cdc-backpressure.d.ts.map +1 -0
- package/dist/worker/cdc-backpressure.js +619 -0
- package/dist/worker/cdc-backpressure.js.map +1 -0
- package/dist/worker/cdc-sse.d.ts +277 -0
- package/dist/worker/cdc-sse.d.ts.map +1 -0
- package/dist/worker/cdc-sse.js +528 -0
- package/dist/worker/cdc-sse.js.map +1 -0
- package/dist/worker/cdc-websocket.d.ts +252 -0
- package/dist/worker/cdc-websocket.d.ts.map +1 -0
- package/dist/worker/cdc-websocket.js +940 -0
- package/dist/worker/cdc-websocket.js.map +1 -0
- package/dist/worker/cdc.d.ts +95 -0
- package/dist/worker/cdc.d.ts.map +1 -0
- package/dist/worker/cdc.js +211 -0
- package/dist/worker/cdc.js.map +1 -0
- package/dist/worker/concerns/auth-concern.d.ts +50 -0
- package/dist/worker/concerns/auth-concern.d.ts.map +1 -0
- package/dist/worker/concerns/auth-concern.js +131 -0
- package/dist/worker/concerns/auth-concern.js.map +1 -0
- package/dist/worker/concerns/cdc-concern.d.ts +99 -0
- package/dist/worker/concerns/cdc-concern.d.ts.map +1 -0
- package/dist/worker/concerns/cdc-concern.js +137 -0
- package/dist/worker/concerns/cdc-concern.js.map +1 -0
- package/dist/worker/concerns/index.d.ts +22 -0
- package/dist/worker/concerns/index.d.ts.map +1 -0
- package/dist/worker/concerns/index.js +13 -0
- package/dist/worker/concerns/index.js.map +1 -0
- package/dist/worker/concerns/query-execution-concern.d.ts +104 -0
- package/dist/worker/concerns/query-execution-concern.d.ts.map +1 -0
- package/dist/worker/concerns/query-execution-concern.js +95 -0
- package/dist/worker/concerns/query-execution-concern.js.map +1 -0
- package/dist/worker/concerns/storage-orchestration-concern.d.ts +78 -0
- package/dist/worker/concerns/storage-orchestration-concern.d.ts.map +1 -0
- package/dist/worker/concerns/storage-orchestration-concern.js +240 -0
- package/dist/worker/concerns/storage-orchestration-concern.js.map +1 -0
- package/dist/worker/do-auth-manager.d.ts +108 -0
- package/dist/worker/do-auth-manager.d.ts.map +1 -0
- package/dist/worker/do-auth-manager.js +212 -0
- package/dist/worker/do-auth-manager.js.map +1 -0
- package/dist/worker/do-pglite-manager.d.ts +137 -0
- package/dist/worker/do-pglite-manager.d.ts.map +1 -0
- package/dist/worker/do-pglite-manager.js +228 -0
- package/dist/worker/do-pglite-manager.js.map +1 -0
- package/dist/worker/do.d.ts +556 -0
- package/dist/worker/do.d.ts.map +1 -0
- package/dist/worker/do.js +1441 -0
- package/dist/worker/do.js.map +1 -0
- package/dist/worker/entry.d.ts +23 -0
- package/dist/worker/entry.d.ts.map +1 -0
- package/dist/worker/entry.js +362 -0
- package/dist/worker/entry.js.map +1 -0
- package/dist/worker/errors.d.ts +106 -0
- package/dist/worker/errors.d.ts.map +1 -0
- package/dist/worker/errors.js +178 -0
- package/dist/worker/errors.js.map +1 -0
- package/dist/worker/health-check-manager.d.ts +141 -0
- package/dist/worker/health-check-manager.d.ts.map +1 -0
- package/dist/worker/health-check-manager.js +145 -0
- package/dist/worker/health-check-manager.js.map +1 -0
- package/dist/worker/index.d.ts +60 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +67 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/memory-pressure.d.ts +892 -0
- package/dist/worker/memory-pressure.d.ts.map +1 -0
- package/dist/worker/memory-pressure.js +1990 -0
- package/dist/worker/memory-pressure.js.map +1 -0
- package/dist/worker/migration-manager.d.ts +153 -0
- package/dist/worker/migration-manager.d.ts.map +1 -0
- package/dist/worker/migration-manager.js +461 -0
- package/dist/worker/migration-manager.js.map +1 -0
- package/dist/worker/plugin-manager.d.ts +147 -0
- package/dist/worker/plugin-manager.d.ts.map +1 -0
- package/dist/worker/plugin-manager.js +408 -0
- package/dist/worker/plugin-manager.js.map +1 -0
- package/dist/worker/proxy.d.ts +330 -0
- package/dist/worker/proxy.d.ts.map +1 -0
- package/dist/worker/proxy.js +504 -0
- package/dist/worker/proxy.js.map +1 -0
- package/dist/worker/query-execution-manager.d.ts +107 -0
- package/dist/worker/query-execution-manager.d.ts.map +1 -0
- package/dist/worker/query-execution-manager.js +155 -0
- package/dist/worker/query-execution-manager.js.map +1 -0
- package/dist/worker/query-executor.d.ts +163 -0
- package/dist/worker/query-executor.d.ts.map +1 -0
- package/dist/worker/query-executor.js +413 -0
- package/dist/worker/query-executor.js.map +1 -0
- package/dist/worker/query-stats-manager.d.ts +117 -0
- package/dist/worker/query-stats-manager.d.ts.map +1 -0
- package/dist/worker/query-stats-manager.js +162 -0
- package/dist/worker/query-stats-manager.js.map +1 -0
- package/dist/worker/result-handler.d.ts +192 -0
- package/dist/worker/result-handler.d.ts.map +1 -0
- package/dist/worker/result-handler.js +346 -0
- package/dist/worker/result-handler.js.map +1 -0
- package/dist/worker/routes.d.ts +135 -0
- package/dist/worker/routes.d.ts.map +1 -0
- package/dist/worker/routes.js +460 -0
- package/dist/worker/routes.js.map +1 -0
- package/dist/worker/rpc-methods-manager.d.ts +142 -0
- package/dist/worker/rpc-methods-manager.d.ts.map +1 -0
- package/dist/worker/rpc-methods-manager.js +195 -0
- package/dist/worker/rpc-methods-manager.js.map +1 -0
- package/dist/worker/rpc.d.ts +259 -0
- package/dist/worker/rpc.d.ts.map +1 -0
- package/dist/worker/rpc.js +398 -0
- package/dist/worker/rpc.js.map +1 -0
- package/dist/worker/schema-version.d.ts +209 -0
- package/dist/worker/schema-version.d.ts.map +1 -0
- package/dist/worker/schema-version.js +450 -0
- package/dist/worker/schema-version.js.map +1 -0
- package/dist/worker/session-manager.d.ts +282 -0
- package/dist/worker/session-manager.d.ts.map +1 -0
- package/dist/worker/session-manager.js +523 -0
- package/dist/worker/session-manager.js.map +1 -0
- package/dist/worker/shutdown-manager.d.ts +188 -0
- package/dist/worker/shutdown-manager.d.ts.map +1 -0
- package/dist/worker/shutdown-manager.js +347 -0
- package/dist/worker/shutdown-manager.js.map +1 -0
- package/dist/worker/sql-transform.d.ts +61 -0
- package/dist/worker/sql-transform.d.ts.map +1 -0
- package/dist/worker/sql-transform.js +312 -0
- package/dist/worker/sql-transform.js.map +1 -0
- package/dist/worker/types.d.ts +738 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +6 -0
- package/dist/worker/types.js.map +1 -0
- package/dist/worker/user-routes.d.ts +76 -0
- package/dist/worker/user-routes.d.ts.map +1 -0
- package/dist/worker/user-routes.js +188 -0
- package/dist/worker/user-routes.js.map +1 -0
- package/dist/worker/wal-facade.d.ts +138 -0
- package/dist/worker/wal-facade.d.ts.map +1 -0
- package/dist/worker/wal-facade.js +184 -0
- package/dist/worker/wal-facade.js.map +1 -0
- package/dist/worker/wal-r2.d.ts +271 -0
- package/dist/worker/wal-r2.d.ts.map +1 -0
- package/dist/worker/wal-r2.js +689 -0
- package/dist/worker/wal-r2.js.map +1 -0
- package/dist/worker/wal-replay.d.ts +361 -0
- package/dist/worker/wal-replay.d.ts.map +1 -0
- package/dist/worker/wal-replay.js +628 -0
- package/dist/worker/wal-replay.js.map +1 -0
- package/dist/worker/wal-retention.d.ts +389 -0
- package/dist/worker/wal-retention.d.ts.map +1 -0
- package/dist/worker/wal-retention.js +763 -0
- package/dist/worker/wal-retention.js.map +1 -0
- package/dist/worker/wal.d.ts +278 -0
- package/dist/worker/wal.d.ts.map +1 -0
- package/dist/worker/wal.js +467 -0
- package/dist/worker/wal.js.map +1 -0
- package/dist/worker/websocket.d.ts +85 -0
- package/dist/worker/websocket.d.ts.map +1 -0
- package/dist/worker/websocket.js +227 -0
- package/dist/worker/websocket.js.map +1 -0
- package/package.json +108 -0
- package/src/cdc/change-stream.ts +137 -0
- package/src/cdc/filter.ts +646 -0
- package/src/cdc/index.ts +112 -0
- package/src/cdc/resume-token.ts +280 -0
- package/src/cdc/transport/index.ts +7 -0
- package/src/cdc/transport/sse.ts +723 -0
- package/src/cdc/transport/websocket.ts +873 -0
- package/src/cdc/types.ts +346 -0
- package/src/config/index.ts +25 -0
- package/src/config/memory.ts +177 -0
- package/src/config/storage.ts +204 -0
- package/src/config/streaming.ts +147 -0
- package/src/config/timeouts.ts +221 -0
- package/src/extensions/config.test.ts +187 -0
- package/src/extensions/config.ts +278 -0
- package/src/extensions/geo.test.ts +455 -0
- package/src/extensions/geo.ts +858 -0
- package/src/extensions/index.test.ts +259 -0
- package/src/extensions/index.ts +227 -0
- package/src/extensions/loader.test.ts +555 -0
- package/src/extensions/loader.ts +588 -0
- package/src/extensions/pgmq-lite.test.ts +727 -0
- package/src/extensions/pgmq-lite.ts +770 -0
- package/src/extensions/plugins.test.ts +528 -0
- package/src/extensions/plugins.ts +718 -0
- package/src/extensions/registry.test.ts +202 -0
- package/src/extensions/registry.ts +267 -0
- package/src/extensions/vector.test.ts +195 -0
- package/src/extensions/vector.ts +217 -0
- package/src/iceberg/SCHEDULER.md +580 -0
- package/src/iceberg/analytics.test.ts +703 -0
- package/src/iceberg/analytics.ts +727 -0
- package/src/iceberg/catalog-api.test.ts +838 -0
- package/src/iceberg/catalog-api.ts +520 -0
- package/src/iceberg/catalog.test.ts +680 -0
- package/src/iceberg/catalog.ts +1007 -0
- package/src/iceberg/iceberg.test.ts +705 -0
- package/src/iceberg/index.ts +406 -0
- package/src/iceberg/metadata.test.ts +632 -0
- package/src/iceberg/metadata.ts +649 -0
- package/src/iceberg/optimizer.test.ts +868 -0
- package/src/iceberg/optimizer.ts +1287 -0
- package/src/iceberg/parquet.test.ts +899 -0
- package/src/iceberg/parquet.ts +1640 -0
- package/src/iceberg/r2-organization.test.ts +615 -0
- package/src/iceberg/r2-organization.ts +951 -0
- package/src/iceberg/scheduler-do-example.ts +364 -0
- package/src/iceberg/scheduler.test.ts +861 -0
- package/src/iceberg/scheduler.ts +1201 -0
- package/src/iceberg/schema.test.ts +547 -0
- package/src/iceberg/schema.ts +616 -0
- package/src/iceberg/snapshot-manager.test.ts +919 -0
- package/src/iceberg/snapshot-manager.ts +1369 -0
- package/src/iceberg/sql-router.test.ts +334 -0
- package/src/iceberg/sql-router.ts +337 -0
- package/src/iceberg/test-fixtures.ts +605 -0
- package/src/iceberg/time-travel-api.test.ts +1029 -0
- package/src/iceberg/time-travel-api.ts +731 -0
- package/src/iceberg/time-travel.test.ts +1218 -0
- package/src/iceberg/time-travel.ts +1052 -0
- package/src/iceberg/transformer.test.ts +689 -0
- package/src/iceberg/transformer.ts +1029 -0
- package/src/iceberg/types.ts +373 -0
- package/src/iceberg/writer.test.ts +716 -0
- package/src/iceberg/writer.ts +590 -0
- package/src/index.ts +212 -0
- package/src/lineage/index.ts +42 -0
- package/src/lineage/integration.ts +334 -0
- package/src/lineage/tracker.ts +1618 -0
- package/src/lineage/types.ts +354 -0
- package/src/middleware/index.ts +36 -0
- package/src/middleware/rate-limit-concurrent.test.ts +794 -0
- package/src/middleware/rate-limit.test.ts +1568 -0
- package/src/middleware/rate-limit.ts +840 -0
- package/src/migration-tooling/external-migration.test.ts +1864 -0
- package/src/migration-tooling/external-migration.ts +2355 -0
- package/src/migration-tooling/index.ts +19 -0
- package/src/migrations/ARCHITECTURE.md +474 -0
- package/src/migrations/PROGRESS_TRACKING.md +485 -0
- package/src/migrations/auto-migrator.test.ts +732 -0
- package/src/migrations/auto-migrator.ts +531 -0
- package/src/migrations/bulk-orchestrator.test.ts +801 -0
- package/src/migrations/bulk-orchestrator.ts +1039 -0
- package/src/migrations/compatibility.test.ts +958 -0
- package/src/migrations/compatibility.ts +902 -0
- package/src/migrations/do-migrations.test.ts +2620 -0
- package/src/migrations/do-migrations.ts +1289 -0
- package/src/migrations/do-migrations.types.ts +715 -0
- package/src/migrations/drizzle-compat.test.ts +210 -0
- package/src/migrations/drizzle-compat.ts +337 -0
- package/src/migrations/index.ts +334 -0
- package/src/migrations/migration-api.test.ts +438 -0
- package/src/migrations/migration-api.ts +704 -0
- package/src/migrations/progress-tracker-do.ts +518 -0
- package/src/migrations/progress-tracker-kv.ts +305 -0
- package/src/migrations/progress-tracker.test.ts +937 -0
- package/src/migrations/progress-tracker.ts +665 -0
- package/src/migrations/registry.test.ts +331 -0
- package/src/migrations/registry.ts +468 -0
- package/src/migrations/rollback.test.ts +644 -0
- package/src/migrations/runner.test.ts +807 -0
- package/src/migrations/runner.test.ts.backup +759 -0
- package/src/migrations/runner.ts +1459 -0
- package/src/migrations/schema-generator.test.ts +649 -0
- package/src/migrations/schema-generator.ts +513 -0
- package/src/migrations/testing.ts +1037 -0
- package/src/migrations/types.ts +573 -0
- package/src/migrations/validator.test.ts +660 -0
- package/src/migrations/validator.ts +741 -0
- package/src/observability/alerting.test.ts +1133 -0
- package/src/observability/alerting.ts +455 -0
- package/src/observability/analytics-engine.ts +733 -0
- package/src/observability/cost-metrics.ts +804 -0
- package/src/observability/cross-do-tracing.test.ts +516 -0
- package/src/observability/cross-do-tracing.ts +588 -0
- package/src/observability/dashboards/postgres-do-overview.json +1656 -0
- package/src/observability/error-rate-collector.test.ts +977 -0
- package/src/observability/error-rate-collector.ts +518 -0
- package/src/observability/exporters.test.ts +365 -0
- package/src/observability/exporters.ts +650 -0
- package/src/observability/health-check.test.ts +353 -0
- package/src/observability/health-check.ts +341 -0
- package/src/observability/index.test.ts +298 -0
- package/src/observability/index.ts +885 -0
- package/src/observability/instrumentation.test.ts +428 -0
- package/src/observability/instrumentation.ts +788 -0
- package/src/observability/memory-metrics.test.ts +355 -0
- package/src/observability/memory-metrics.ts +990 -0
- package/src/observability/metrics-endpoint.test.ts +402 -0
- package/src/observability/metrics-endpoint.ts +374 -0
- package/src/observability/metrics.test.ts +291 -0
- package/src/observability/metrics.ts +315 -0
- package/src/observability/observability-features.ts +1296 -0
- package/src/observability/prometheus.test.ts +292 -0
- package/src/observability/prometheus.ts +170 -0
- package/src/observability/propagation.test.ts +417 -0
- package/src/observability/propagation.ts +294 -0
- package/src/observability/query-latency.ts +586 -0
- package/src/observability/query-performance.test.ts +406 -0
- package/src/observability/query-performance.ts +491 -0
- package/src/observability/storage-tier-metrics.test.ts +633 -0
- package/src/observability/storage-tier-metrics.ts +570 -0
- package/src/observability/tier-cost-optimizer.ts +740 -0
- package/src/observability/tracer.test.ts +346 -0
- package/src/observability/tracer.ts +585 -0
- package/src/observability/types.test.ts +726 -0
- package/src/observability/types.ts +434 -0
- package/src/pglite/auto-demotion.test.ts +477 -0
- package/src/pglite/auto-demotion.ts +385 -0
- package/src/pglite/auto-promotion.test.ts +824 -0
- package/src/pglite/auto-promotion.ts +547 -0
- package/src/pglite/cache-layer.test.ts +469 -0
- package/src/pglite/cache-layer.ts +271 -0
- package/src/pglite/cold-start-manager.ts +1260 -0
- package/src/pglite/cold-start-optimizer.test.ts +937 -0
- package/src/pglite/cold-start-optimizer.ts +1895 -0
- package/src/pglite/dovfs-adapter.ts +1122 -0
- package/src/pglite/dovfs.ts +1258 -0
- package/src/pglite/etag-cache.test.ts +844 -0
- package/src/pglite/etag-cache.ts +526 -0
- package/src/pglite/index.ts +442 -0
- package/src/pglite/init.test.ts +455 -0
- package/src/pglite/init.ts +574 -0
- package/src/pglite/lifecycle.test.ts +599 -0
- package/src/pglite/lifecycle.ts +704 -0
- package/src/pglite/parallel-loader.test.ts +586 -0
- package/src/pglite/parallel-loader.ts +481 -0
- package/src/pglite/production-pglite.test.ts +666 -0
- package/src/pglite/production-pglite.ts +537 -0
- package/src/pglite/query-executor.ts +614 -0
- package/src/pglite/r2-layer.test.ts +501 -0
- package/src/pglite/r2-layer.ts +322 -0
- package/src/pglite/tiered-init.test.ts +725 -0
- package/src/pglite/tiered-init.ts +556 -0
- package/src/pglite/tiered-vfs.test.ts +726 -0
- package/src/pglite/tiered-vfs.ts +33 -0
- package/src/pglite/tiering-stats.test.ts +531 -0
- package/src/pglite/tiering-stats.ts +407 -0
- package/src/pglite/transaction-hooks.ts +343 -0
- package/src/pglite/warm-loader.test.ts +1701 -0
- package/src/pglite/warm-loader.ts +528 -0
- package/src/pglite/workers-pglite.ts +224 -0
- package/src/pglite-assets/pglite.data +0 -0
- package/src/pglite-assets/pglite.wasm +0 -0
- package/src/pglite.d.ts +47 -0
- package/src/playground/index.ts +137 -0
- package/src/playground/keyboard-shortcuts.ts +677 -0
- package/src/playground/playground.ts +323 -0
- package/src/playground/query-executor.ts +669 -0
- package/src/playground/query-history.ts +328 -0
- package/src/playground/result-formatter.ts +420 -0
- package/src/playground/sample-datasets.ts +674 -0
- package/src/playground/sample-queries.ts +1168 -0
- package/src/playground/schema-explorer.ts +558 -0
- package/src/playground/types.ts +518 -0
- package/src/readonly/cache-reader.test.ts +460 -0
- package/src/readonly/cache-reader.ts +313 -0
- package/src/readonly/config.test.ts +187 -0
- package/src/readonly/config.ts +128 -0
- package/src/readonly/index.ts +50 -0
- package/src/readonly/pglite-wrapper.test.ts +278 -0
- package/src/readonly/pglite-wrapper.ts +184 -0
- package/src/readonly/worker.test.ts +533 -0
- package/src/readonly/worker.ts +341 -0
- package/src/readonly/write-blocker.test.ts +459 -0
- package/src/readonly/write-blocker.ts +175 -0
- package/src/recovery/disaster-recovery.test.ts +618 -0
- package/src/recovery/disaster-recovery.ts +1181 -0
- package/src/recovery/index.ts +43 -0
- package/src/recovery/parquet-parser.ts +974 -0
- package/src/retention/index.ts +74 -0
- package/src/retention/policy.test.ts +571 -0
- package/src/retention/policy.ts +774 -0
- package/src/retention/purger.test.ts +465 -0
- package/src/retention/purger.ts +558 -0
- package/src/rls/auth-integration.test.ts +752 -0
- package/src/rls/auth-integration.ts +533 -0
- package/src/rls/generator.test.ts +829 -0
- package/src/rls/generator.ts +573 -0
- package/src/rls/index.ts +128 -0
- package/src/rls/policy.ts +208 -0
- package/src/rls/rls.test.ts +1071 -0
- package/src/rls/validator.test.ts +930 -0
- package/src/rls/validator.ts +895 -0
- package/src/routing/adaptive-router.test.ts +884 -0
- package/src/routing/adaptive-router.ts +845 -0
- package/src/routing/circuit-breaker.test.ts +1505 -0
- package/src/routing/circuit-breaker.ts +852 -0
- package/src/routing/cost-metrics.test.ts +565 -0
- package/src/routing/cost-metrics.ts +408 -0
- package/src/routing/do-connection-pool.test.ts +1109 -0
- package/src/routing/do-connection-pool.ts +828 -0
- package/src/routing/index.ts +158 -0
- package/src/routing/query-complexity-estimator.test.ts +356 -0
- package/src/routing/query-complexity-estimator.ts +444 -0
- package/src/routing/request-coalescing.test.ts +738 -0
- package/src/routing/request-coalescing.ts +475 -0
- package/src/routing/runtime-router.test.ts +436 -0
- package/src/routing/runtime-router.ts +357 -0
- package/src/routing/tenant-router.test.ts +2493 -0
- package/src/routing/tenant-router.ts +1908 -0
- package/src/routing/websocket-pool.test.ts +551 -0
- package/src/routing/websocket-pool.ts +577 -0
- package/src/storage/access-pattern-tracker.test.ts +874 -0
- package/src/storage/cache-layer.test.ts +560 -0
- package/src/storage/cache-layer.ts +328 -0
- package/src/storage/cost-aware-tiering.test.ts +652 -0
- package/src/storage/cost-aware-tiering.ts +794 -0
- package/src/storage/do-sqlite-blobs.test.ts +937 -0
- package/src/storage/index.ts +272 -0
- package/src/storage/interfaces.ts +974 -0
- package/src/storage/r2-layer.test.ts +653 -0
- package/src/storage/r2-layer.ts +434 -0
- package/src/storage/r2-overflow.ts +920 -0
- package/src/storage/r2-page-vfs.test.ts +2348 -0
- package/src/storage/r2-page-vfs.ts +1054 -0
- package/src/storage/swr-cache.test.ts +832 -0
- package/src/storage/swr-cache.ts +398 -0
- package/src/storage/swr-tiered-integration.test.ts +617 -0
- package/src/storage/tiered-orchestrator.test.ts +2441 -0
- package/src/storage/tiered-orchestrator.ts +2081 -0
- package/src/storage/tiered-vfs-swr.test.ts +736 -0
- package/src/storage/tiered-vfs-swr.ts +735 -0
- package/src/storage/tiered-vfs.test.ts +793 -0
- package/src/storage/tiered-vfs.ts +1082 -0
- package/src/streaming/backpressure-controller.ts +452 -0
- package/src/streaming/buffer-pool.ts +484 -0
- package/src/streaming/cdc-iceberg-connector.ts +605 -0
- package/src/streaming/index.ts +225 -0
- package/src/streaming/live-cdc-stream.ts +985 -0
- package/src/streaming/memory-bounded-stream.ts +443 -0
- package/src/streaming/query-streamer.ts +662 -0
- package/src/streaming/response-streaming.ts +557 -0
- package/src/types/branded.ts +1075 -0
- package/src/types/branded.ts.backup +273 -0
- package/src/types/utilities.ts +1023 -0
- package/src/types/wasm.d.ts +30 -0
- package/src/validation/typed-errors.test.ts +420 -0
- package/src/wal/replay-engine.ts +1264 -0
- package/src/worker/__mocks__/capnweb.ts +15 -0
- package/src/worker/__mocks__/pglite.data.ts +22 -0
- package/src/worker/__mocks__/pglite.wasm.ts +33 -0
- package/src/worker/auth-rate-limiter.test.ts +272 -0
- package/src/worker/auth-rate-limiter.ts +448 -0
- package/src/worker/auth.security-red.test.ts +1236 -0
- package/src/worker/auth.security.test.ts +822 -0
- package/src/worker/auth.test.ts +469 -0
- package/src/worker/auth.ts +1104 -0
- package/src/worker/cdc-backpressure.test.ts +726 -0
- package/src/worker/cdc-backpressure.ts +866 -0
- package/src/worker/cdc-sse.test.ts +780 -0
- package/src/worker/cdc-sse.ts +728 -0
- package/src/worker/cdc-websocket.ts +1229 -0
- package/src/worker/cdc-ws.test.ts +1009 -0
- package/src/worker/cdc.test.ts +327 -0
- package/src/worker/cdc.ts +289 -0
- package/src/worker/concerns/auth-concern.ts +179 -0
- package/src/worker/concerns/cdc-concern.ts +247 -0
- package/src/worker/concerns/index.ts +58 -0
- package/src/worker/concerns/query-execution-concern.ts +194 -0
- package/src/worker/concerns/storage-orchestration-concern.ts +373 -0
- package/src/worker/discriminated-types.test.ts +280 -0
- package/src/worker/do-auth-manager.ts +257 -0
- package/src/worker/do-decomposition.test.ts +1236 -0
- package/src/worker/do-pglite-manager.ts +302 -0
- package/src/worker/do.test.ts +2254 -0
- package/src/worker/do.ts +1878 -0
- package/src/worker/entry.ts +417 -0
- package/src/worker/errors.ts +285 -0
- package/src/worker/health-check-manager.test.ts +261 -0
- package/src/worker/health-check-manager.ts +231 -0
- package/src/worker/index.ts +389 -0
- package/src/worker/memory-pressure.test.ts +1460 -0
- package/src/worker/memory-pressure.ts +2650 -0
- package/src/worker/migration-manager.ts +582 -0
- package/src/worker/neon-compat.test.ts +332 -0
- package/src/worker/plugin-manager.ts +485 -0
- package/src/worker/postgres.do-rpc.d.ts +76 -0
- package/src/worker/proxy.ts +694 -0
- package/src/worker/query-execution-manager.test.ts +303 -0
- package/src/worker/query-execution-manager.ts +219 -0
- package/src/worker/query-executor.test.ts +282 -0
- package/src/worker/query-executor.ts +560 -0
- package/src/worker/query-stats-manager.ts +229 -0
- package/src/worker/result-handler.test.ts +364 -0
- package/src/worker/result-handler.ts +510 -0
- package/src/worker/routes.test.ts +795 -0
- package/src/worker/routes.ts +650 -0
- package/src/worker/rpc-methods-manager.test.ts +326 -0
- package/src/worker/rpc-methods-manager.ts +276 -0
- package/src/worker/rpc.ts +524 -0
- package/src/worker/schema-version.ts +605 -0
- package/src/worker/session-manager.test.ts +506 -0
- package/src/worker/session-manager.ts +732 -0
- package/src/worker/shutdown-manager.ts +469 -0
- package/src/worker/sql-transform.test.ts +286 -0
- package/src/worker/sql-transform.ts +368 -0
- package/src/worker/supabase-compat.test.ts +621 -0
- package/src/worker/types.test.ts +292 -0
- package/src/worker/types.ts +873 -0
- package/src/worker/user-routes.test.ts +703 -0
- package/src/worker/user-routes.ts +303 -0
- package/src/worker/wal-facade.ts +235 -0
- package/src/worker/wal-r2.test.ts +570 -0
- package/src/worker/wal-r2.ts +930 -0
- package/src/worker/wal-replay.test.ts +845 -0
- package/src/worker/wal-replay.ts +897 -0
- package/src/worker/wal-retention.test.ts +758 -0
- package/src/worker/wal-retention.ts +1075 -0
- package/src/worker/wal.test.ts +618 -0
- package/src/worker/wal.ts +697 -0
- package/src/worker/websocket.test.ts +296 -0
- package/src/worker/websocket.ts +284 -0
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RED PHASE Tests for Write Blocking Middleware
|
|
3
|
+
*
|
|
4
|
+
* Rejects all write operations in read-only deployment mode.
|
|
5
|
+
* These tests should FAIL until implementation is complete.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, it, expect } from 'vitest'
|
|
9
|
+
import {
|
|
10
|
+
isWriteQuery,
|
|
11
|
+
WriteBlockedError,
|
|
12
|
+
createWriteBlocker,
|
|
13
|
+
SQL_WRITE_PATTERNS,
|
|
14
|
+
} from './write-blocker'
|
|
15
|
+
import type { ReadOnlyConfig } from './config'
|
|
16
|
+
|
|
17
|
+
describe('Write Blocking Middleware', () => {
|
|
18
|
+
describe('SQL_WRITE_PATTERNS', () => {
|
|
19
|
+
it('should be an array of regex patterns', () => {
|
|
20
|
+
expect(Array.isArray(SQL_WRITE_PATTERNS)).toBe(true)
|
|
21
|
+
expect(SQL_WRITE_PATTERNS.length).toBeGreaterThan(0)
|
|
22
|
+
expect(SQL_WRITE_PATTERNS[0]).toBeInstanceOf(RegExp)
|
|
23
|
+
})
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
describe('isWriteQuery()', () => {
|
|
27
|
+
describe('INSERT statements', () => {
|
|
28
|
+
it('should detect simple INSERT', () => {
|
|
29
|
+
expect(isWriteQuery('INSERT INTO users (name) VALUES ($1)')).toBe(true)
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('should detect INSERT with schema', () => {
|
|
33
|
+
expect(isWriteQuery('INSERT INTO public.users (name) VALUES ($1)')).toBe(true)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('should detect INSERT with lowercase', () => {
|
|
37
|
+
expect(isWriteQuery('insert into users (name) values ($1)')).toBe(true)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it('should detect INSERT with leading whitespace', () => {
|
|
41
|
+
expect(isWriteQuery(' INSERT INTO users (name) VALUES ($1)')).toBe(true)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('should detect INSERT with leading newline', () => {
|
|
45
|
+
expect(isWriteQuery('\nINSERT INTO users (name) VALUES ($1)')).toBe(true)
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
describe('UPDATE statements', () => {
|
|
50
|
+
it('should detect simple UPDATE', () => {
|
|
51
|
+
expect(isWriteQuery('UPDATE users SET name = $1 WHERE id = $2')).toBe(true)
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it('should detect UPDATE with schema', () => {
|
|
55
|
+
expect(isWriteQuery('UPDATE public.users SET name = $1')).toBe(true)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('should detect UPDATE with lowercase', () => {
|
|
59
|
+
expect(isWriteQuery('update users set name = $1')).toBe(true)
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
describe('DELETE statements', () => {
|
|
64
|
+
it('should detect simple DELETE', () => {
|
|
65
|
+
expect(isWriteQuery('DELETE FROM users WHERE id = $1')).toBe(true)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('should detect DELETE with lowercase', () => {
|
|
69
|
+
expect(isWriteQuery('delete from users where id = $1')).toBe(true)
|
|
70
|
+
})
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
describe('DDL statements', () => {
|
|
74
|
+
it('should detect CREATE TABLE', () => {
|
|
75
|
+
expect(isWriteQuery('CREATE TABLE users (id INT PRIMARY KEY)')).toBe(true)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('should detect CREATE INDEX', () => {
|
|
79
|
+
expect(isWriteQuery('CREATE INDEX idx_name ON users(name)')).toBe(true)
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
it('should detect CREATE SCHEMA', () => {
|
|
83
|
+
expect(isWriteQuery('CREATE SCHEMA myschema')).toBe(true)
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
it('should detect ALTER TABLE', () => {
|
|
87
|
+
expect(isWriteQuery('ALTER TABLE users ADD COLUMN email TEXT')).toBe(true)
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
it('should detect DROP TABLE', () => {
|
|
91
|
+
expect(isWriteQuery('DROP TABLE users')).toBe(true)
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
it('should detect DROP INDEX', () => {
|
|
95
|
+
expect(isWriteQuery('DROP INDEX idx_name')).toBe(true)
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
it('should detect TRUNCATE', () => {
|
|
99
|
+
expect(isWriteQuery('TRUNCATE TABLE users')).toBe(true)
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
describe('Transaction statements', () => {
|
|
104
|
+
it('should detect COMMIT (can commit writes)', () => {
|
|
105
|
+
expect(isWriteQuery('COMMIT')).toBe(true)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('should allow BEGIN (needed for read transactions)', () => {
|
|
109
|
+
expect(isWriteQuery('BEGIN')).toBe(false)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it('should allow ROLLBACK (safe)', () => {
|
|
113
|
+
expect(isWriteQuery('ROLLBACK')).toBe(false)
|
|
114
|
+
})
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
describe('Other write statements', () => {
|
|
118
|
+
it('should detect GRANT', () => {
|
|
119
|
+
expect(isWriteQuery('GRANT SELECT ON users TO readonly_user')).toBe(true)
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
it('should detect REVOKE', () => {
|
|
123
|
+
expect(isWriteQuery('REVOKE SELECT ON users FROM readonly_user')).toBe(true)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it('should detect VACUUM', () => {
|
|
127
|
+
expect(isWriteQuery('VACUUM users')).toBe(true)
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
it('should detect REINDEX', () => {
|
|
131
|
+
expect(isWriteQuery('REINDEX TABLE users')).toBe(true)
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
it('should detect COPY ... FROM (write)', () => {
|
|
135
|
+
expect(isWriteQuery("COPY users FROM '/path/to/file.csv'")).toBe(true)
|
|
136
|
+
})
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
describe('Read-only statements', () => {
|
|
140
|
+
it('should allow SELECT', () => {
|
|
141
|
+
expect(isWriteQuery('SELECT * FROM users WHERE id = $1')).toBe(false)
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it('should allow SELECT with CTE', () => {
|
|
145
|
+
expect(isWriteQuery('WITH active_users AS (SELECT * FROM users WHERE active = true) SELECT * FROM active_users')).toBe(false)
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
it('should allow EXPLAIN', () => {
|
|
149
|
+
expect(isWriteQuery('EXPLAIN SELECT * FROM users')).toBe(false)
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
it('should allow EXPLAIN ANALYZE on SELECT', () => {
|
|
153
|
+
expect(isWriteQuery('EXPLAIN ANALYZE SELECT * FROM users')).toBe(false)
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
it('should allow SHOW statements', () => {
|
|
157
|
+
expect(isWriteQuery('SHOW search_path')).toBe(false)
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
it('should allow SET statements (session only)', () => {
|
|
161
|
+
expect(isWriteQuery('SET search_path TO public')).toBe(false)
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
it('should allow COPY ... TO (read)', () => {
|
|
165
|
+
expect(isWriteQuery("COPY users TO '/path/to/file.csv'")).toBe(false)
|
|
166
|
+
})
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
describe('Edge cases', () => {
|
|
170
|
+
it('should detect INSERT in subquery context', () => {
|
|
171
|
+
// This is a write even though it looks like it has a SELECT
|
|
172
|
+
expect(isWriteQuery('INSERT INTO archive SELECT * FROM users WHERE created < $1')).toBe(true)
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
it('should handle empty string', () => {
|
|
176
|
+
expect(isWriteQuery('')).toBe(false)
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
it('should handle whitespace only', () => {
|
|
180
|
+
expect(isWriteQuery(' \n\t ')).toBe(false)
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
it('should detect UPDATE inside CTE', () => {
|
|
184
|
+
expect(isWriteQuery('WITH updated AS (UPDATE users SET active = false RETURNING *) SELECT * FROM updated')).toBe(true)
|
|
185
|
+
})
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
describe('Advanced write patterns (security critical)', () => {
|
|
189
|
+
it('should detect MERGE (upsert)', () => {
|
|
190
|
+
expect(isWriteQuery('MERGE INTO users USING new_data ON users.id = new_data.id WHEN MATCHED THEN UPDATE SET name = new_data.name')).toBe(true)
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
it('should detect COMMENT ON (metadata modification)', () => {
|
|
194
|
+
expect(isWriteQuery("COMMENT ON TABLE users IS 'User accounts'")).toBe(true)
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
it('should detect COMMENT ON COLUMN', () => {
|
|
198
|
+
expect(isWriteQuery("COMMENT ON COLUMN users.name IS 'Full name'")).toBe(true)
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
it('should detect RENAME', () => {
|
|
202
|
+
expect(isWriteQuery('RENAME TABLE users TO old_users')).toBe(true)
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
it('should detect CLUSTER (rewrites table)', () => {
|
|
206
|
+
expect(isWriteQuery('CLUSTER users USING users_pkey')).toBe(true)
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
it('should detect REFRESH MATERIALIZED VIEW', () => {
|
|
210
|
+
expect(isWriteQuery('REFRESH MATERIALIZED VIEW active_users')).toBe(true)
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
it('should detect REFRESH MATERIALIZED VIEW CONCURRENTLY', () => {
|
|
214
|
+
expect(isWriteQuery('REFRESH MATERIALIZED VIEW CONCURRENTLY active_users')).toBe(true)
|
|
215
|
+
})
|
|
216
|
+
|
|
217
|
+
it('should detect ANALYZE', () => {
|
|
218
|
+
expect(isWriteQuery('ANALYZE users')).toBe(true)
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
it('should detect SAVEPOINT', () => {
|
|
222
|
+
expect(isWriteQuery('SAVEPOINT my_savepoint')).toBe(true)
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
it('should detect RELEASE SAVEPOINT', () => {
|
|
226
|
+
expect(isWriteQuery('RELEASE SAVEPOINT my_savepoint')).toBe(true)
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
it('should detect PREPARE TRANSACTION (two-phase commit)', () => {
|
|
230
|
+
expect(isWriteQuery("PREPARE TRANSACTION 'tx123'")).toBe(true)
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
it('should detect COMMIT PREPARED', () => {
|
|
234
|
+
expect(isWriteQuery("COMMIT PREPARED 'tx123'")).toBe(true)
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
it('should detect ROLLBACK PREPARED', () => {
|
|
238
|
+
expect(isWriteQuery("ROLLBACK PREPARED 'tx123'")).toBe(true)
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
it('should detect LOCK TABLE', () => {
|
|
242
|
+
expect(isWriteQuery('LOCK TABLE users IN EXCLUSIVE MODE')).toBe(true)
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
it('should detect LOCK', () => {
|
|
246
|
+
expect(isWriteQuery('LOCK users')).toBe(true)
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
it('should detect DO blocks (arbitrary SQL)', () => {
|
|
250
|
+
expect(isWriteQuery("DO $$ BEGIN INSERT INTO users (name) VALUES ('test'); END $$")).toBe(true)
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
it('should detect CALL (procedure invocation)', () => {
|
|
254
|
+
expect(isWriteQuery('CALL update_all_users()')).toBe(true)
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
it('should detect EXECUTE (prepared statement)', () => {
|
|
258
|
+
expect(isWriteQuery('EXECUTE insert_user(1, $1)')).toBe(true)
|
|
259
|
+
})
|
|
260
|
+
|
|
261
|
+
it('should detect NOTIFY', () => {
|
|
262
|
+
expect(isWriteQuery("NOTIFY channel, 'payload'")).toBe(true)
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
it('should detect DISCARD', () => {
|
|
266
|
+
expect(isWriteQuery('DISCARD ALL')).toBe(true)
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
it('should detect SECURITY LABEL', () => {
|
|
270
|
+
expect(isWriteQuery("SECURITY LABEL FOR selinux ON TABLE users IS 's0:c123'")).toBe(true)
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
it('should detect LOAD', () => {
|
|
274
|
+
expect(isWriteQuery("LOAD 'auto_explain'")).toBe(true)
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
it('should detect CREATE OR REPLACE', () => {
|
|
278
|
+
expect(isWriteQuery("CREATE OR REPLACE FUNCTION my_func() RETURNS void AS $$ BEGIN END; $$ LANGUAGE plpgsql")).toBe(true)
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
it('should detect INSERT without INTO', () => {
|
|
282
|
+
// PostgreSQL allows INSERT table (...) VALUES (...)
|
|
283
|
+
expect(isWriteQuery('INSERT users (name) VALUES ($1)')).toBe(true)
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
it('should detect DELETE without FROM', () => {
|
|
287
|
+
// Some DB dialects allow DELETE table WHERE...
|
|
288
|
+
expect(isWriteQuery('DELETE users WHERE id = 1')).toBe(true)
|
|
289
|
+
})
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
describe('Allowed read operations (should NOT block)', () => {
|
|
293
|
+
it('should allow LISTEN (read notification channel)', () => {
|
|
294
|
+
expect(isWriteQuery('LISTEN channel')).toBe(false)
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
it('should allow UNLISTEN', () => {
|
|
298
|
+
expect(isWriteQuery('UNLISTEN channel')).toBe(false)
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
it('should allow FETCH', () => {
|
|
302
|
+
expect(isWriteQuery('FETCH 10 FROM my_cursor')).toBe(false)
|
|
303
|
+
})
|
|
304
|
+
|
|
305
|
+
it('should allow MOVE', () => {
|
|
306
|
+
expect(isWriteQuery('MOVE 5 IN my_cursor')).toBe(false)
|
|
307
|
+
})
|
|
308
|
+
|
|
309
|
+
it('should allow CLOSE cursor', () => {
|
|
310
|
+
expect(isWriteQuery('CLOSE my_cursor')).toBe(false)
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
it('should allow DECLARE cursor', () => {
|
|
314
|
+
expect(isWriteQuery('DECLARE my_cursor CURSOR FOR SELECT * FROM users')).toBe(false)
|
|
315
|
+
})
|
|
316
|
+
|
|
317
|
+
it('should allow TABLE keyword (shorthand for SELECT)', () => {
|
|
318
|
+
expect(isWriteQuery('TABLE users')).toBe(false)
|
|
319
|
+
})
|
|
320
|
+
|
|
321
|
+
it('should allow VALUES for read', () => {
|
|
322
|
+
expect(isWriteQuery("VALUES (1, 'a'), (2, 'b')")).toBe(false)
|
|
323
|
+
})
|
|
324
|
+
})
|
|
325
|
+
})
|
|
326
|
+
|
|
327
|
+
describe('WriteBlockedError', () => {
|
|
328
|
+
it('should be an Error instance', () => {
|
|
329
|
+
const error = new WriteBlockedError('INSERT INTO users ...')
|
|
330
|
+
expect(error).toBeInstanceOf(Error)
|
|
331
|
+
})
|
|
332
|
+
|
|
333
|
+
it('should have name WriteBlockedError', () => {
|
|
334
|
+
const error = new WriteBlockedError('INSERT INTO users ...')
|
|
335
|
+
expect(error.name).toBe('WriteBlockedError')
|
|
336
|
+
})
|
|
337
|
+
|
|
338
|
+
it('should include the blocked query in message', () => {
|
|
339
|
+
const error = new WriteBlockedError('INSERT INTO users ...')
|
|
340
|
+
expect(error.message).toContain('read-only')
|
|
341
|
+
})
|
|
342
|
+
|
|
343
|
+
it('should store the original query', () => {
|
|
344
|
+
const query = 'INSERT INTO users (name) VALUES ($1)'
|
|
345
|
+
const error = new WriteBlockedError(query)
|
|
346
|
+
expect(error.query).toBe(query)
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
it('should have SQLSTATE code for read-only transaction', () => {
|
|
350
|
+
const error = new WriteBlockedError('INSERT ...')
|
|
351
|
+
// 25006 = read_only_sql_transaction
|
|
352
|
+
expect(error.code).toBe('25006')
|
|
353
|
+
})
|
|
354
|
+
})
|
|
355
|
+
|
|
356
|
+
describe('createWriteBlocker()', () => {
|
|
357
|
+
const defaultConfig: ReadOnlyConfig = {
|
|
358
|
+
enabled: true,
|
|
359
|
+
onWriteAttempt: 'throw',
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
it('should return a function', () => {
|
|
363
|
+
const blocker = createWriteBlocker(defaultConfig)
|
|
364
|
+
expect(typeof blocker).toBe('function')
|
|
365
|
+
})
|
|
366
|
+
|
|
367
|
+
describe('with throw mode', () => {
|
|
368
|
+
const config: ReadOnlyConfig = {
|
|
369
|
+
enabled: true,
|
|
370
|
+
onWriteAttempt: 'throw',
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
it('should throw WriteBlockedError for INSERT', () => {
|
|
374
|
+
const blocker = createWriteBlocker(config)
|
|
375
|
+
expect(() => blocker('INSERT INTO users (name) VALUES ($1)')).toThrow(WriteBlockedError)
|
|
376
|
+
})
|
|
377
|
+
|
|
378
|
+
it('should throw WriteBlockedError for UPDATE', () => {
|
|
379
|
+
const blocker = createWriteBlocker(config)
|
|
380
|
+
expect(() => blocker('UPDATE users SET name = $1')).toThrow(WriteBlockedError)
|
|
381
|
+
})
|
|
382
|
+
|
|
383
|
+
it('should throw WriteBlockedError for DELETE', () => {
|
|
384
|
+
const blocker = createWriteBlocker(config)
|
|
385
|
+
expect(() => blocker('DELETE FROM users WHERE id = $1')).toThrow(WriteBlockedError)
|
|
386
|
+
})
|
|
387
|
+
|
|
388
|
+
it('should allow SELECT queries', () => {
|
|
389
|
+
const blocker = createWriteBlocker(config)
|
|
390
|
+
expect(() => blocker('SELECT * FROM users')).not.toThrow()
|
|
391
|
+
})
|
|
392
|
+
|
|
393
|
+
it('should return the query for read operations', () => {
|
|
394
|
+
const blocker = createWriteBlocker(config)
|
|
395
|
+
const query = 'SELECT * FROM users'
|
|
396
|
+
expect(blocker(query)).toBe(query)
|
|
397
|
+
})
|
|
398
|
+
})
|
|
399
|
+
|
|
400
|
+
describe('with ignore mode', () => {
|
|
401
|
+
const config: ReadOnlyConfig = {
|
|
402
|
+
enabled: true,
|
|
403
|
+
onWriteAttempt: 'ignore',
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
it('should not throw for INSERT', () => {
|
|
407
|
+
const blocker = createWriteBlocker(config)
|
|
408
|
+
expect(() => blocker('INSERT INTO users (name) VALUES ($1)')).not.toThrow()
|
|
409
|
+
})
|
|
410
|
+
|
|
411
|
+
it('should return null for blocked writes', () => {
|
|
412
|
+
const blocker = createWriteBlocker(config)
|
|
413
|
+
expect(blocker('INSERT INTO users (name) VALUES ($1)')).toBeNull()
|
|
414
|
+
})
|
|
415
|
+
|
|
416
|
+
it('should return the query for SELECT', () => {
|
|
417
|
+
const blocker = createWriteBlocker(config)
|
|
418
|
+
expect(blocker('SELECT * FROM users')).toBe('SELECT * FROM users')
|
|
419
|
+
})
|
|
420
|
+
})
|
|
421
|
+
|
|
422
|
+
describe('with log mode', () => {
|
|
423
|
+
const config: ReadOnlyConfig = {
|
|
424
|
+
enabled: true,
|
|
425
|
+
onWriteAttempt: 'log',
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
it('should not throw for INSERT', () => {
|
|
429
|
+
const blocker = createWriteBlocker(config)
|
|
430
|
+
expect(() => blocker('INSERT INTO users (name) VALUES ($1)')).not.toThrow()
|
|
431
|
+
})
|
|
432
|
+
|
|
433
|
+
it('should return null for blocked writes', () => {
|
|
434
|
+
const blocker = createWriteBlocker(config)
|
|
435
|
+
expect(blocker('UPDATE users SET name = $1')).toBeNull()
|
|
436
|
+
})
|
|
437
|
+
})
|
|
438
|
+
|
|
439
|
+
describe('when read-only is disabled', () => {
|
|
440
|
+
const config: ReadOnlyConfig = {
|
|
441
|
+
enabled: false,
|
|
442
|
+
onWriteAttempt: 'throw',
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
it('should allow INSERT when disabled', () => {
|
|
446
|
+
const blocker = createWriteBlocker(config)
|
|
447
|
+
const query = 'INSERT INTO users (name) VALUES ($1)'
|
|
448
|
+
expect(blocker(query)).toBe(query)
|
|
449
|
+
})
|
|
450
|
+
|
|
451
|
+
it('should allow all operations when disabled', () => {
|
|
452
|
+
const blocker = createWriteBlocker(config)
|
|
453
|
+
expect(blocker('DELETE FROM users')).toBe('DELETE FROM users')
|
|
454
|
+
expect(blocker('UPDATE users SET x = 1')).toBe('UPDATE users SET x = 1')
|
|
455
|
+
expect(blocker('DROP TABLE users')).toBe('DROP TABLE users')
|
|
456
|
+
})
|
|
457
|
+
})
|
|
458
|
+
})
|
|
459
|
+
})
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write Blocking Middleware
|
|
3
|
+
*
|
|
4
|
+
* Rejects all write operations in read-only deployment mode.
|
|
5
|
+
* Security feature to ensure writes are impossible.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ReadOnlyConfig } from './config'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* SQL patterns that indicate a write operation.
|
|
12
|
+
* These patterns are case-insensitive and match at the start of a query
|
|
13
|
+
* (after trimming whitespace).
|
|
14
|
+
*
|
|
15
|
+
* SECURITY: This list must be exhaustive to prevent ANY data modification.
|
|
16
|
+
*/
|
|
17
|
+
export const SQL_WRITE_PATTERNS: RegExp[] = [
|
|
18
|
+
// DML write operations
|
|
19
|
+
/^\s*INSERT\s+INTO\b/i,
|
|
20
|
+
/^\s*INSERT\s+/i, // Some dialects allow INSERT without INTO
|
|
21
|
+
/^\s*UPDATE\s+/i,
|
|
22
|
+
/^\s*DELETE\s+FROM\b/i,
|
|
23
|
+
/^\s*DELETE\s+/i, // DELETE without FROM (e.g., DELETE users WHERE...)
|
|
24
|
+
/^\s*MERGE\s+/i, // SQL MERGE (upsert) statement
|
|
25
|
+
|
|
26
|
+
// DDL operations
|
|
27
|
+
/^\s*CREATE\s+/i,
|
|
28
|
+
/^\s*ALTER\s+/i,
|
|
29
|
+
/^\s*DROP\s+/i,
|
|
30
|
+
/^\s*TRUNCATE\s+/i,
|
|
31
|
+
/^\s*COMMENT\s+ON\b/i, // COMMENT ON TABLE/COLUMN modifies metadata
|
|
32
|
+
/^\s*RENAME\s+/i, // PostgreSQL RENAME
|
|
33
|
+
|
|
34
|
+
// Permission changes
|
|
35
|
+
/^\s*GRANT\s+/i,
|
|
36
|
+
/^\s*REVOKE\s+/i,
|
|
37
|
+
|
|
38
|
+
// Maintenance operations that modify data
|
|
39
|
+
/^\s*VACUUM\b/i,
|
|
40
|
+
/^\s*REINDEX\s+/i,
|
|
41
|
+
/^\s*CLUSTER\s+/i, // CLUSTER rewrites table data
|
|
42
|
+
/^\s*REFRESH\s+MATERIALIZED\s+VIEW\b/i, // Modifies materialized view data
|
|
43
|
+
/^\s*ANALYZE\b/i, // Updates statistics (can be considered write)
|
|
44
|
+
|
|
45
|
+
// COPY FROM (imports data)
|
|
46
|
+
/^\s*COPY\s+\S+\s+FROM\b/i,
|
|
47
|
+
|
|
48
|
+
// COMMIT can commit pending writes
|
|
49
|
+
/^\s*COMMIT\b/i,
|
|
50
|
+
|
|
51
|
+
// Savepoint manipulation (could be used to commit partial writes)
|
|
52
|
+
/^\s*SAVEPOINT\b/i,
|
|
53
|
+
/^\s*RELEASE\s+SAVEPOINT\b/i,
|
|
54
|
+
|
|
55
|
+
// Transaction control that could affect data
|
|
56
|
+
/^\s*PREPARE\s+TRANSACTION\b/i, // Two-phase commit
|
|
57
|
+
/^\s*COMMIT\s+PREPARED\b/i,
|
|
58
|
+
/^\s*ROLLBACK\s+PREPARED\b/i,
|
|
59
|
+
|
|
60
|
+
// Lock operations (could be used to interfere with reads)
|
|
61
|
+
/^\s*LOCK\s+TABLE\b/i,
|
|
62
|
+
/^\s*LOCK\s+/i,
|
|
63
|
+
|
|
64
|
+
// Extension and procedure modifications
|
|
65
|
+
/^\s*CREATE\s+OR\s+REPLACE\b/i,
|
|
66
|
+
|
|
67
|
+
// DO blocks can execute arbitrary SQL including writes
|
|
68
|
+
/^\s*DO\s+/i,
|
|
69
|
+
|
|
70
|
+
// CALL can invoke procedures that write data
|
|
71
|
+
/^\s*CALL\s+/i,
|
|
72
|
+
|
|
73
|
+
// EXECUTE can run prepared statements that write
|
|
74
|
+
/^\s*EXECUTE\s+/i,
|
|
75
|
+
|
|
76
|
+
// NOTIFY/LISTEN can be used for side effects
|
|
77
|
+
/^\s*NOTIFY\b/i,
|
|
78
|
+
|
|
79
|
+
// DISCARD can affect session state
|
|
80
|
+
/^\s*DISCARD\s+/i,
|
|
81
|
+
|
|
82
|
+
// SECURITY LABEL modifies labels
|
|
83
|
+
/^\s*SECURITY\s+LABEL\b/i,
|
|
84
|
+
|
|
85
|
+
// LOAD loads external modules
|
|
86
|
+
/^\s*LOAD\b/i,
|
|
87
|
+
|
|
88
|
+
// CTE with write operations (WITH ... UPDATE/INSERT/DELETE)
|
|
89
|
+
/^\s*WITH\s+[\s\S]*?\b(UPDATE|INSERT|DELETE)\b/i,
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Check if a SQL query is a write operation.
|
|
94
|
+
*
|
|
95
|
+
* @param sql - The SQL query to check
|
|
96
|
+
* @returns true if the query would modify data
|
|
97
|
+
*/
|
|
98
|
+
export function isWriteQuery(sql: string): boolean {
|
|
99
|
+
if (!sql || !sql.trim()) {
|
|
100
|
+
return false
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const trimmed = sql.trim()
|
|
104
|
+
|
|
105
|
+
for (const pattern of SQL_WRITE_PATTERNS) {
|
|
106
|
+
if (pattern.test(trimmed)) {
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return false
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Error thrown when a write operation is blocked in read-only mode.
|
|
116
|
+
*/
|
|
117
|
+
export class WriteBlockedError extends Error {
|
|
118
|
+
/** The blocked SQL query */
|
|
119
|
+
readonly query: string
|
|
120
|
+
|
|
121
|
+
/** PostgreSQL SQLSTATE code for read-only transaction */
|
|
122
|
+
readonly code: string = '25006'
|
|
123
|
+
|
|
124
|
+
/** Error name */
|
|
125
|
+
override readonly name: string = 'WriteBlockedError'
|
|
126
|
+
|
|
127
|
+
constructor(query: string) {
|
|
128
|
+
super(`Write operation blocked: database is in read-only mode`)
|
|
129
|
+
this.query = query
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Write blocker function type.
|
|
135
|
+
* Returns the query if allowed, null if ignored, or throws if blocked.
|
|
136
|
+
*/
|
|
137
|
+
export type WriteBlockerFn = (sql: string) => string | null
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Create a write blocker function based on configuration.
|
|
141
|
+
*
|
|
142
|
+
* @param config - Read-only configuration
|
|
143
|
+
* @returns A function that checks and potentially blocks write queries
|
|
144
|
+
*/
|
|
145
|
+
export function createWriteBlocker(config: ReadOnlyConfig): WriteBlockerFn {
|
|
146
|
+
return (sql: string): string | null => {
|
|
147
|
+
// If read-only mode is disabled, allow everything
|
|
148
|
+
if (!config.enabled) {
|
|
149
|
+
return sql
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Check if this is a write query
|
|
153
|
+
if (!isWriteQuery(sql)) {
|
|
154
|
+
return sql
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Handle write attempt based on configuration
|
|
158
|
+
switch (config.onWriteAttempt) {
|
|
159
|
+
case 'throw':
|
|
160
|
+
throw new WriteBlockedError(sql)
|
|
161
|
+
|
|
162
|
+
case 'ignore':
|
|
163
|
+
return null
|
|
164
|
+
|
|
165
|
+
case 'log':
|
|
166
|
+
// In a real implementation, we would log here
|
|
167
|
+
// console.warn(`[read-only] Blocked write query: ${sql.substring(0, 100)}...`)
|
|
168
|
+
return null
|
|
169
|
+
|
|
170
|
+
default:
|
|
171
|
+
// Default to throw for safety
|
|
172
|
+
throw new WriteBlockedError(sql)
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|