@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,792 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RLS Policy Validator
|
|
3
|
+
*
|
|
4
|
+
* SECURITY CRITICAL: This module validates Row-Level Security policies to prevent:
|
|
5
|
+
* - SQL injection attacks via policy names, table names, role names, and expressions
|
|
6
|
+
* - Privilege escalation through malicious policy expressions
|
|
7
|
+
* - Denial of service through dangerous function calls
|
|
8
|
+
* - Information disclosure via system catalog access
|
|
9
|
+
* - Unicode-based attacks (homoglyphs, zero-width, RTL override)
|
|
10
|
+
*
|
|
11
|
+
* All user-provided input MUST be validated through this module before being
|
|
12
|
+
* used to construct SQL statements for RLS policy creation or modification.
|
|
13
|
+
*
|
|
14
|
+
* @module rls/validator
|
|
15
|
+
*/
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// SQL RESERVED KEYWORDS
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* SQL reserved keywords that should be avoided as identifiers.
|
|
21
|
+
* Using these as unquoted identifiers can cause syntax errors or
|
|
22
|
+
* unexpected behavior. The validator warns when these are used.
|
|
23
|
+
*/
|
|
24
|
+
const SQL_RESERVED_KEYWORDS = new Set([
|
|
25
|
+
'select',
|
|
26
|
+
'insert',
|
|
27
|
+
'update',
|
|
28
|
+
'delete',
|
|
29
|
+
'from',
|
|
30
|
+
'where',
|
|
31
|
+
'table',
|
|
32
|
+
'create',
|
|
33
|
+
'drop',
|
|
34
|
+
'alter',
|
|
35
|
+
'index',
|
|
36
|
+
'grant',
|
|
37
|
+
'revoke',
|
|
38
|
+
'order',
|
|
39
|
+
'group',
|
|
40
|
+
'by',
|
|
41
|
+
'having',
|
|
42
|
+
'join',
|
|
43
|
+
'left',
|
|
44
|
+
'right',
|
|
45
|
+
'inner',
|
|
46
|
+
'outer',
|
|
47
|
+
'on',
|
|
48
|
+
'as',
|
|
49
|
+
'and',
|
|
50
|
+
'or',
|
|
51
|
+
'not',
|
|
52
|
+
'null',
|
|
53
|
+
'true',
|
|
54
|
+
'false',
|
|
55
|
+
'primary',
|
|
56
|
+
'key',
|
|
57
|
+
'foreign',
|
|
58
|
+
'references',
|
|
59
|
+
'constraint',
|
|
60
|
+
'unique',
|
|
61
|
+
'check',
|
|
62
|
+
'default',
|
|
63
|
+
'cascade',
|
|
64
|
+
'set',
|
|
65
|
+
'values',
|
|
66
|
+
'into',
|
|
67
|
+
'view',
|
|
68
|
+
'function',
|
|
69
|
+
'procedure',
|
|
70
|
+
'trigger',
|
|
71
|
+
'sequence',
|
|
72
|
+
'schema',
|
|
73
|
+
'database',
|
|
74
|
+
'user',
|
|
75
|
+
'role',
|
|
76
|
+
'policy',
|
|
77
|
+
'row',
|
|
78
|
+
'level',
|
|
79
|
+
'security',
|
|
80
|
+
'using',
|
|
81
|
+
'with',
|
|
82
|
+
'all',
|
|
83
|
+
'any',
|
|
84
|
+
'some',
|
|
85
|
+
'exists',
|
|
86
|
+
'in',
|
|
87
|
+
'between',
|
|
88
|
+
'like',
|
|
89
|
+
'is',
|
|
90
|
+
'case',
|
|
91
|
+
'when',
|
|
92
|
+
'then',
|
|
93
|
+
'else',
|
|
94
|
+
'end',
|
|
95
|
+
'begin',
|
|
96
|
+
'commit',
|
|
97
|
+
'rollback',
|
|
98
|
+
'transaction',
|
|
99
|
+
]);
|
|
100
|
+
// =============================================================================
|
|
101
|
+
// DANGEROUS FUNCTION BLOCKLIST
|
|
102
|
+
// =============================================================================
|
|
103
|
+
/**
|
|
104
|
+
* PostgreSQL functions that MUST NOT appear in RLS policy expressions.
|
|
105
|
+
*
|
|
106
|
+
* These functions are blocked because they can be exploited for:
|
|
107
|
+
*
|
|
108
|
+
* - **Timing attacks (DoS)**:
|
|
109
|
+
* - `pg_sleep` - delays execution, enables timing-based attacks
|
|
110
|
+
*
|
|
111
|
+
* - **Process termination (DoS)**:
|
|
112
|
+
* - `pg_cancel_backend` - cancels queries on other backends
|
|
113
|
+
* - `pg_terminate_backend` - forcibly terminates other connections
|
|
114
|
+
*
|
|
115
|
+
* - **File system access (Data exfiltration/modification)**:
|
|
116
|
+
* - `pg_read_file` - reads arbitrary files from the server filesystem
|
|
117
|
+
* - `pg_write_file` - writes arbitrary files to the server filesystem
|
|
118
|
+
* - `lo_import` - imports a file into a large object
|
|
119
|
+
* - `lo_export` - exports a large object to a file
|
|
120
|
+
* - `copy` - bulk data import/export to filesystem
|
|
121
|
+
*
|
|
122
|
+
* - **Network access (Remote code execution)**:
|
|
123
|
+
* - `dblink` - executes queries on remote PostgreSQL servers
|
|
124
|
+
*/
|
|
125
|
+
const DANGEROUS_FUNCTIONS = [
|
|
126
|
+
'pg_sleep',
|
|
127
|
+
'pg_cancel_backend',
|
|
128
|
+
'pg_terminate_backend',
|
|
129
|
+
'pg_read_file',
|
|
130
|
+
'pg_write_file',
|
|
131
|
+
'lo_import',
|
|
132
|
+
'lo_export',
|
|
133
|
+
'dblink',
|
|
134
|
+
'copy',
|
|
135
|
+
];
|
|
136
|
+
// =============================================================================
|
|
137
|
+
// DANGEROUS DDL PATTERN DEFINITIONS
|
|
138
|
+
// =============================================================================
|
|
139
|
+
/**
|
|
140
|
+
* DDL statements that MUST NOT appear in RLS policy expressions.
|
|
141
|
+
*
|
|
142
|
+
* These patterns detect privilege escalation attempts where an attacker
|
|
143
|
+
* tries to embed DDL statements within policy expressions to:
|
|
144
|
+
* - Grant themselves elevated privileges (GRANT)
|
|
145
|
+
* - Revoke security controls (REVOKE)
|
|
146
|
+
* - Create new privileged accounts (CREATE USER/ROLE)
|
|
147
|
+
* - Modify existing account privileges (ALTER USER/ROLE)
|
|
148
|
+
* - Remove security accounts (DROP USER/ROLE)
|
|
149
|
+
*
|
|
150
|
+
* All patterns are case-insensitive to prevent bypass via mixed case.
|
|
151
|
+
*/
|
|
152
|
+
const DANGEROUS_DDL_PATTERNS = [
|
|
153
|
+
/** Detects GRANT statements - privilege escalation */
|
|
154
|
+
/\bGRANT\b/i,
|
|
155
|
+
/** Detects REVOKE statements - removing security controls */
|
|
156
|
+
/\bREVOKE\b/i,
|
|
157
|
+
/** Detects CREATE USER statements - creating privileged accounts */
|
|
158
|
+
/\bCREATE\s+USER\b/i,
|
|
159
|
+
/** Detects CREATE ROLE statements - creating privileged roles */
|
|
160
|
+
/\bCREATE\s+ROLE\b/i,
|
|
161
|
+
/** Detects ALTER ROLE statements - modifying role privileges */
|
|
162
|
+
/\bALTER\s+ROLE\b/i,
|
|
163
|
+
/** Detects ALTER USER statements - modifying user privileges */
|
|
164
|
+
/\bALTER\s+USER\b/i,
|
|
165
|
+
/** Detects DROP USER statements - removing security accounts */
|
|
166
|
+
/\bDROP\s+USER\b/i,
|
|
167
|
+
/** Detects DROP ROLE statements - removing security roles */
|
|
168
|
+
/\bDROP\s+ROLE\b/i,
|
|
169
|
+
];
|
|
170
|
+
// =============================================================================
|
|
171
|
+
// SECURITY BYPASS PATTERN DEFINITIONS
|
|
172
|
+
// =============================================================================
|
|
173
|
+
/**
|
|
174
|
+
* Patterns that indicate RLS policy bypass attempts.
|
|
175
|
+
*
|
|
176
|
+
* These patterns detect common SQL injection techniques that would cause
|
|
177
|
+
* a policy to return TRUE for all rows, effectively bypassing row-level security:
|
|
178
|
+
*
|
|
179
|
+
* - `1=1` - Classic always-true condition
|
|
180
|
+
* - `OR 'x'='x'` - String comparison bypass (e.g., `user_id = 1 OR 'x'='x'`)
|
|
181
|
+
*
|
|
182
|
+
* When detected, the validator issues a warning as these patterns may indicate
|
|
183
|
+
* either a security issue or an intentionally permissive policy.
|
|
184
|
+
*/
|
|
185
|
+
const BYPASS_PATTERNS = [
|
|
186
|
+
/** Detects standalone 1=1 condition - always evaluates to TRUE */
|
|
187
|
+
/^\s*1\s*=\s*1\s*$/,
|
|
188
|
+
/** Detects OR with string equality bypass - e.g., OR 'x'='x' */
|
|
189
|
+
/\bOR\s+['"][^'"]+['"]\s*=\s*['"][^'"]+['"]/i,
|
|
190
|
+
];
|
|
191
|
+
// =============================================================================
|
|
192
|
+
// IDENTIFIER VALIDATION PATTERNS
|
|
193
|
+
// =============================================================================
|
|
194
|
+
/**
|
|
195
|
+
* Pattern for valid PostgreSQL role names.
|
|
196
|
+
* Roles must start with a letter or underscore, followed by letters, digits, or underscores.
|
|
197
|
+
* This restrictive pattern prevents injection via role names in GRANT TO clauses.
|
|
198
|
+
*/
|
|
199
|
+
const VALID_ROLE_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
200
|
+
/**
|
|
201
|
+
* Pattern for valid PostgreSQL identifiers (unquoted).
|
|
202
|
+
* Must start with a letter or underscore, followed by letters, digits, or underscores.
|
|
203
|
+
* Does not allow hyphens (those require quoting).
|
|
204
|
+
*/
|
|
205
|
+
const VALID_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
206
|
+
/**
|
|
207
|
+
* Pattern for schema-qualified identifiers (e.g., `public.users`).
|
|
208
|
+
* Both schema and table name must be valid identifiers separated by a single dot.
|
|
209
|
+
*/
|
|
210
|
+
const SCHEMA_QUALIFIED_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*\.[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
211
|
+
/**
|
|
212
|
+
* Pattern for valid table names, allowing optional hyphens (requires quoting in SQL).
|
|
213
|
+
* More permissive than VALID_IDENTIFIER_PATTERN to support hyphenated names.
|
|
214
|
+
*/
|
|
215
|
+
const VALID_TABLE_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_-]*(\.[a-zA-Z_][a-zA-Z0-9_-]*)?$/;
|
|
216
|
+
/**
|
|
217
|
+
* Pattern for valid tenant IDs.
|
|
218
|
+
* Allows alphanumeric characters, hyphens, and underscores.
|
|
219
|
+
* Supports UUID format (with hyphens).
|
|
220
|
+
*/
|
|
221
|
+
const VALID_TENANT_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
|
|
222
|
+
/** Maximum length for PostgreSQL identifiers */
|
|
223
|
+
const MAX_IDENTIFIER_LENGTH = 63;
|
|
224
|
+
/** Pattern for valid policy name start (letter, underscore, or quoted) */
|
|
225
|
+
const VALID_POLICY_NAME_START = /^[a-zA-Z_]/;
|
|
226
|
+
// =============================================================================
|
|
227
|
+
// UNICODE SECURITY PATTERNS
|
|
228
|
+
// =============================================================================
|
|
229
|
+
/**
|
|
230
|
+
* Unicode character patterns that indicate potential security attacks.
|
|
231
|
+
*
|
|
232
|
+
* These patterns detect:
|
|
233
|
+
*
|
|
234
|
+
* - **Null byte injection** (U+0000):
|
|
235
|
+
* Can truncate strings in C-based parsers, potentially bypassing validation
|
|
236
|
+
*
|
|
237
|
+
* - **Zero-width characters** (U+200B-U+200F):
|
|
238
|
+
* Invisible characters that can hide malicious content or confuse parsers
|
|
239
|
+
*
|
|
240
|
+
* - **Bidirectional text controls** (U+202A-U+202E):
|
|
241
|
+
* Can reverse text direction, hiding malicious code (Trojan Source attack)
|
|
242
|
+
*
|
|
243
|
+
* - **Cyrillic characters** (U+0400-U+04FF):
|
|
244
|
+
* Used in homoglyph attacks where visually similar characters from different
|
|
245
|
+
* scripts are used to create confusingly similar identifiers
|
|
246
|
+
* (e.g., Cyrillic 'a' U+0430 vs Latin 'a' U+0061)
|
|
247
|
+
*/
|
|
248
|
+
const UNSAFE_UNICODE_PATTERNS = [
|
|
249
|
+
/** Null byte - can cause string truncation in C parsers */
|
|
250
|
+
/[\u0000]/,
|
|
251
|
+
/** Zero-width characters - invisible, can hide malicious content */
|
|
252
|
+
/[\u200B-\u200F]/,
|
|
253
|
+
/** Bidirectional text controls - enables Trojan Source attacks */
|
|
254
|
+
/[\u202A-\u202E]/,
|
|
255
|
+
/** Cyrillic characters - common source of homoglyph attacks */
|
|
256
|
+
/[\u0400-\u04FF]/,
|
|
257
|
+
];
|
|
258
|
+
// =============================================================================
|
|
259
|
+
// SQL INJECTION DETECTION PATTERNS
|
|
260
|
+
// =============================================================================
|
|
261
|
+
/**
|
|
262
|
+
* Patterns that indicate SQL injection attempts in identifiers.
|
|
263
|
+
*
|
|
264
|
+
* These patterns detect common SQL injection techniques:
|
|
265
|
+
*
|
|
266
|
+
* - **Semicolon** (;): Statement terminator, enables stacked queries
|
|
267
|
+
* - **Double dash** (--): Line comment, can comment out security checks
|
|
268
|
+
* - **Block comment start** (/*): Can comment out or inject code
|
|
269
|
+
* - **Block comment end** (*\/): Can close injected comments
|
|
270
|
+
* - **DROP keyword**: Data destruction
|
|
271
|
+
* - **TRUNCATE keyword**: Data destruction
|
|
272
|
+
* - **ALTER keyword**: Schema/privilege modification
|
|
273
|
+
*/
|
|
274
|
+
const SQL_INJECTION_PATTERNS = [
|
|
275
|
+
/** Semicolon - statement terminator, enables stacked queries */
|
|
276
|
+
/;/,
|
|
277
|
+
/** Double dash - line comment, can hide or bypass code */
|
|
278
|
+
/--/,
|
|
279
|
+
/** Block comment open - can inject or hide code */
|
|
280
|
+
/\/\*/,
|
|
281
|
+
/** Block comment close - ends injected comments */
|
|
282
|
+
/\*\//,
|
|
283
|
+
/** DROP keyword - destructive DDL (case-insensitive) */
|
|
284
|
+
/\bDROP\b/i,
|
|
285
|
+
/** TRUNCATE keyword - destructive DDL (case-insensitive) */
|
|
286
|
+
/\bTRUNCATE\b/i,
|
|
287
|
+
/** ALTER keyword - schema/privilege modification (case-insensitive) */
|
|
288
|
+
/\bALTER\b/i,
|
|
289
|
+
];
|
|
290
|
+
// =============================================================================
|
|
291
|
+
// EXPRESSION ANALYSIS PATTERNS
|
|
292
|
+
// =============================================================================
|
|
293
|
+
/**
|
|
294
|
+
* Pattern to detect subqueries in policy expressions.
|
|
295
|
+
* Subqueries (SELECT statements) can impact performance and may be used
|
|
296
|
+
* for information disclosure via side-channel attacks.
|
|
297
|
+
*/
|
|
298
|
+
const SUBQUERY_PATTERN = /\bSELECT\b/i;
|
|
299
|
+
/**
|
|
300
|
+
* Patterns to detect arithmetic expressions that clearly don't return boolean.
|
|
301
|
+
* Used as a secondary check after pg_typeof to catch edge cases.
|
|
302
|
+
*/
|
|
303
|
+
const ARITHMETIC_EXPRESSION_PATTERNS = [
|
|
304
|
+
/** Simple binary arithmetic: 1 + 1, 2 * 3, etc. */
|
|
305
|
+
/^\s*\d+\s*[+\-*/%]\s*\d+\s*$/,
|
|
306
|
+
/** Just a number - not a boolean expression */
|
|
307
|
+
/^\s*\d+\s*$/,
|
|
308
|
+
];
|
|
309
|
+
// =============================================================================
|
|
310
|
+
// CORE VALIDATION HELPER FUNCTIONS
|
|
311
|
+
// =============================================================================
|
|
312
|
+
/**
|
|
313
|
+
* Tests a string against a collection of security patterns.
|
|
314
|
+
*
|
|
315
|
+
* This is the core pattern-matching function used by all security validators.
|
|
316
|
+
* It returns true if ANY pattern in the collection matches the input string.
|
|
317
|
+
*
|
|
318
|
+
* @param str - The string to test
|
|
319
|
+
* @param patterns - Array of regex patterns to test against
|
|
320
|
+
* @returns true if any pattern matches, false otherwise
|
|
321
|
+
*
|
|
322
|
+
* @internal
|
|
323
|
+
*/
|
|
324
|
+
function matchesAnyPattern(str, patterns) {
|
|
325
|
+
return patterns.some((pattern) => pattern.test(str));
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Checks if a string contains SQL injection patterns.
|
|
329
|
+
*
|
|
330
|
+
* SECURITY CRITICAL: This function detects common SQL injection techniques
|
|
331
|
+
* including statement terminators, comments, and destructive DDL keywords.
|
|
332
|
+
*
|
|
333
|
+
* Detected patterns:
|
|
334
|
+
* - Semicolons (stacked queries)
|
|
335
|
+
* - Comment syntax (-- and /*)
|
|
336
|
+
* - DROP, TRUNCATE, ALTER keywords
|
|
337
|
+
*
|
|
338
|
+
* @param str - The string to validate
|
|
339
|
+
* @returns true if injection patterns detected, false if safe
|
|
340
|
+
*/
|
|
341
|
+
function containsUnsafePatterns(str) {
|
|
342
|
+
return matchesAnyPattern(str, SQL_INJECTION_PATTERNS);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Checks if a string contains dangerous Unicode characters.
|
|
346
|
+
*
|
|
347
|
+
* SECURITY CRITICAL: This function detects Unicode-based attacks including:
|
|
348
|
+
* - Null byte injection (string truncation attacks)
|
|
349
|
+
* - Zero-width characters (hidden content)
|
|
350
|
+
* - Bidirectional text overrides (Trojan Source attacks)
|
|
351
|
+
* - Cyrillic characters (homoglyph attacks)
|
|
352
|
+
*
|
|
353
|
+
* @param str - The string to validate
|
|
354
|
+
* @returns true if dangerous Unicode detected, false if safe
|
|
355
|
+
*/
|
|
356
|
+
function containsUnsafeUnicode(str) {
|
|
357
|
+
return matchesAnyPattern(str, UNSAFE_UNICODE_PATTERNS);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Checks if an expression contains dangerous DDL patterns.
|
|
361
|
+
*
|
|
362
|
+
* SECURITY CRITICAL: This function detects privilege escalation attempts
|
|
363
|
+
* where attackers embed DDL statements in policy expressions to:
|
|
364
|
+
* - Grant themselves privileges (GRANT)
|
|
365
|
+
* - Create superuser accounts (CREATE USER/ROLE)
|
|
366
|
+
* - Modify existing privileges (ALTER USER/ROLE)
|
|
367
|
+
*
|
|
368
|
+
* @param expr - The SQL expression to validate
|
|
369
|
+
* @returns true if dangerous DDL detected, false if safe
|
|
370
|
+
*/
|
|
371
|
+
function containsDangerousDDL(expr) {
|
|
372
|
+
return matchesAnyPattern(expr, DANGEROUS_DDL_PATTERNS);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Checks if an expression contains RLS bypass patterns.
|
|
376
|
+
*
|
|
377
|
+
* SECURITY WARNING: Detects patterns that would cause a policy to return TRUE
|
|
378
|
+
* for all rows, effectively bypassing row-level security. This includes:
|
|
379
|
+
* - Tautologies like `1=1`
|
|
380
|
+
* - OR-based bypasses like `OR 'x'='x'`
|
|
381
|
+
*
|
|
382
|
+
* Returns true for detection; the validator will issue a warning (not error)
|
|
383
|
+
* since some use cases may legitimately need permissive policies.
|
|
384
|
+
*
|
|
385
|
+
* @param expr - The SQL expression to check
|
|
386
|
+
* @returns true if bypass pattern detected, false otherwise
|
|
387
|
+
*/
|
|
388
|
+
function containsBypassPattern(expr) {
|
|
389
|
+
return matchesAnyPattern(expr, BYPASS_PATTERNS);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Checks if an expression contains a subquery.
|
|
393
|
+
*
|
|
394
|
+
* Subqueries in RLS policies can:
|
|
395
|
+
* - Impact query performance significantly
|
|
396
|
+
* - Enable information disclosure via side-channel attacks
|
|
397
|
+
* - Cause unexpected behavior with correlated queries
|
|
398
|
+
*
|
|
399
|
+
* @param expr - The SQL expression to check
|
|
400
|
+
* @returns true if subquery detected, false otherwise
|
|
401
|
+
*/
|
|
402
|
+
function containsSubquery(expr) {
|
|
403
|
+
return SUBQUERY_PATTERN.test(expr);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Checks if an expression is clearly an arithmetic operation (not boolean).
|
|
407
|
+
*
|
|
408
|
+
* This provides a secondary validation layer to catch edge cases where
|
|
409
|
+
* PostgreSQL's pg_typeof might not correctly identify non-boolean expressions.
|
|
410
|
+
*
|
|
411
|
+
* @param expr - The expression to check
|
|
412
|
+
* @returns true if the expression is arithmetic, false otherwise
|
|
413
|
+
*
|
|
414
|
+
* @internal
|
|
415
|
+
*/
|
|
416
|
+
function isArithmeticExpression(expr) {
|
|
417
|
+
return matchesAnyPattern(expr, ARITHMETIC_EXPRESSION_PATTERNS);
|
|
418
|
+
}
|
|
419
|
+
// =============================================================================
|
|
420
|
+
// STRING VALIDATION FUNCTIONS
|
|
421
|
+
// =============================================================================
|
|
422
|
+
/**
|
|
423
|
+
* Validates a role name for SQL safety.
|
|
424
|
+
*
|
|
425
|
+
* SECURITY CRITICAL: Role names are used in GRANT TO clauses and must be
|
|
426
|
+
* strictly validated to prevent privilege escalation attacks.
|
|
427
|
+
*
|
|
428
|
+
* Validation rules:
|
|
429
|
+
* 1. No SQL injection patterns
|
|
430
|
+
* 2. No dangerous Unicode characters
|
|
431
|
+
* 3. Must match PostgreSQL identifier format (letter/underscore start,
|
|
432
|
+
* followed by letters, digits, underscores)
|
|
433
|
+
*
|
|
434
|
+
* @param role - The role name to validate
|
|
435
|
+
* @returns true if role name is safe, false otherwise
|
|
436
|
+
*/
|
|
437
|
+
function isValidRoleName(role) {
|
|
438
|
+
if (containsUnsafePatterns(role)) {
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
if (containsUnsafeUnicode(role)) {
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
444
|
+
return VALID_ROLE_PATTERN.test(role);
|
|
445
|
+
}
|
|
446
|
+
// =============================================================================
|
|
447
|
+
// IDENTIFIER VALIDATION FUNCTIONS (EXPORTED)
|
|
448
|
+
// =============================================================================
|
|
449
|
+
/**
|
|
450
|
+
* Validates a PostgreSQL identifier for correctness.
|
|
451
|
+
*
|
|
452
|
+
* Checks if an identifier follows PostgreSQL naming rules:
|
|
453
|
+
* - Must start with a letter (a-z, A-Z) or underscore (_)
|
|
454
|
+
* - Subsequent characters can be letters, digits, or underscores
|
|
455
|
+
* - Schema-qualified names (schema.table) are allowed
|
|
456
|
+
*
|
|
457
|
+
* Note: This validates the format only, not SQL injection safety.
|
|
458
|
+
* For security validation, use validateTableName() or validatePolicy().
|
|
459
|
+
*
|
|
460
|
+
* @param identifier - The identifier to validate
|
|
461
|
+
* @returns true if the identifier is valid, false otherwise
|
|
462
|
+
*/
|
|
463
|
+
export function isValidIdentifier(identifier) {
|
|
464
|
+
if (SCHEMA_QUALIFIED_PATTERN.test(identifier)) {
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
467
|
+
return VALID_IDENTIFIER_PATTERN.test(identifier);
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Determines if an identifier requires double-quoting in SQL.
|
|
471
|
+
*
|
|
472
|
+
* PostgreSQL requires quoting for identifiers that:
|
|
473
|
+
* - Contain characters other than letters, digits, underscores
|
|
474
|
+
* - Start with a digit
|
|
475
|
+
* - Are reserved keywords (handled separately)
|
|
476
|
+
*
|
|
477
|
+
* @param identifier - The identifier to check
|
|
478
|
+
* @returns true if quoting is required, false otherwise
|
|
479
|
+
*/
|
|
480
|
+
export function needsQuoting(identifier) {
|
|
481
|
+
return !VALID_IDENTIFIER_PATTERN.test(identifier) && !SCHEMA_QUALIFIED_PATTERN.test(identifier);
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Wraps an identifier in double quotes if necessary for SQL safety.
|
|
485
|
+
*
|
|
486
|
+
* Use this function when constructing SQL statements with user-provided
|
|
487
|
+
* identifiers. Already-valid identifiers are returned unchanged.
|
|
488
|
+
*
|
|
489
|
+
* WARNING: This function only adds quotes for format compliance, not
|
|
490
|
+
* security. Always validate identifiers with validateTableName() or
|
|
491
|
+
* validatePolicy() before using in SQL.
|
|
492
|
+
*
|
|
493
|
+
* @param identifier - The identifier to potentially quote
|
|
494
|
+
* @returns The identifier, quoted if necessary
|
|
495
|
+
*/
|
|
496
|
+
export function quoteIdentifier(identifier) {
|
|
497
|
+
if (needsQuoting(identifier)) {
|
|
498
|
+
return '"' + identifier + '"';
|
|
499
|
+
}
|
|
500
|
+
return identifier;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Validates a table name for SQL safety.
|
|
504
|
+
*
|
|
505
|
+
* SECURITY CRITICAL: Table names are directly interpolated into SQL
|
|
506
|
+
* statements. This function ensures the name is safe from injection.
|
|
507
|
+
*
|
|
508
|
+
* Validation rules:
|
|
509
|
+
* 1. No SQL injection patterns (semicolons, comments, DDL keywords)
|
|
510
|
+
* 2. Must match valid table name format (letters, digits, underscores,
|
|
511
|
+
* optional hyphens, optional schema prefix)
|
|
512
|
+
*
|
|
513
|
+
* @param table - The table name to validate
|
|
514
|
+
* @returns true if the table name is safe, false otherwise
|
|
515
|
+
*/
|
|
516
|
+
export function validateTableName(table) {
|
|
517
|
+
if (containsUnsafePatterns(table)) {
|
|
518
|
+
return false;
|
|
519
|
+
}
|
|
520
|
+
return VALID_TABLE_NAME_PATTERN.test(table);
|
|
521
|
+
}
|
|
522
|
+
// =============================================================================
|
|
523
|
+
// POLICY CLAUSE VALIDATION HELPERS
|
|
524
|
+
// =============================================================================
|
|
525
|
+
/**
|
|
526
|
+
* Validates a policy name and collects errors/warnings.
|
|
527
|
+
*
|
|
528
|
+
* @internal
|
|
529
|
+
*/
|
|
530
|
+
function validatePolicyName(name, errors, warnings) {
|
|
531
|
+
if (!name || name.trim() === '') {
|
|
532
|
+
errors.push('Policy name cannot be empty');
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
// Check name format (must start with letter/underscore unless quoted)
|
|
536
|
+
if (!VALID_POLICY_NAME_START.test(name) && !name.startsWith('"')) {
|
|
537
|
+
errors.push('Policy name must start with a letter or underscore');
|
|
538
|
+
}
|
|
539
|
+
// Check PostgreSQL identifier length limit
|
|
540
|
+
if (name.length > MAX_IDENTIFIER_LENGTH) {
|
|
541
|
+
errors.push('Policy name is too long (max ' + MAX_IDENTIFIER_LENGTH + ' characters)');
|
|
542
|
+
}
|
|
543
|
+
// Security: Check for SQL injection patterns
|
|
544
|
+
if (containsUnsafePatterns(name)) {
|
|
545
|
+
errors.push('Policy name contains unsafe characters');
|
|
546
|
+
}
|
|
547
|
+
// Security: Check for Unicode attacks
|
|
548
|
+
if (containsUnsafeUnicode(name)) {
|
|
549
|
+
errors.push('Policy name contains unsafe Unicode characters');
|
|
550
|
+
}
|
|
551
|
+
// Warning: Reserved keyword usage
|
|
552
|
+
if (SQL_RESERVED_KEYWORDS.has(name.toLowerCase())) {
|
|
553
|
+
warnings.push('Policy name "' + name + '" is a reserved SQL keyword');
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Validates a table name and collects errors/warnings.
|
|
558
|
+
*
|
|
559
|
+
* @internal
|
|
560
|
+
*/
|
|
561
|
+
function validatePolicyTableName(table, errors, warnings) {
|
|
562
|
+
if (!table || table.trim() === '') {
|
|
563
|
+
errors.push('Table name cannot be empty');
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
// Security: Check for SQL injection patterns
|
|
567
|
+
if (containsUnsafePatterns(table)) {
|
|
568
|
+
errors.push('Table name contains unsafe characters');
|
|
569
|
+
}
|
|
570
|
+
// Security: Check for Unicode attacks
|
|
571
|
+
if (containsUnsafeUnicode(table)) {
|
|
572
|
+
errors.push('Table name contains unsafe Unicode characters');
|
|
573
|
+
}
|
|
574
|
+
// Extract base table name (handle schema.table format)
|
|
575
|
+
const tableName = table.includes('.') ? (table.split('.')[1] ?? table) : table;
|
|
576
|
+
// Warning: Reserved keyword usage
|
|
577
|
+
if (SQL_RESERVED_KEYWORDS.has(tableName.toLowerCase())) {
|
|
578
|
+
warnings.push('Table name "' + tableName + '" is a reserved SQL keyword');
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Validates policy expression (USING or CHECK clause) for security issues.
|
|
583
|
+
*
|
|
584
|
+
* @internal
|
|
585
|
+
*/
|
|
586
|
+
function validatePolicyExpression(expr, clauseName, errors, warnings) {
|
|
587
|
+
// Security: Check for dangerous PostgreSQL functions
|
|
588
|
+
for (const func of DANGEROUS_FUNCTIONS) {
|
|
589
|
+
const funcPattern = new RegExp('\\b' + func + '\\b', 'i');
|
|
590
|
+
if (funcPattern.test(expr)) {
|
|
591
|
+
errors.push(clauseName + ' clause contains dangerous function: ' + func);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
// Security: Check for DDL privilege escalation
|
|
595
|
+
if (containsDangerousDDL(expr)) {
|
|
596
|
+
errors.push(clauseName + ' clause contains unsafe DDL statement');
|
|
597
|
+
}
|
|
598
|
+
// Security: Check for Unicode attacks
|
|
599
|
+
if (containsUnsafeUnicode(expr)) {
|
|
600
|
+
errors.push(clauseName + ' clause contains unsafe Unicode characters');
|
|
601
|
+
}
|
|
602
|
+
// Performance/Security: Check for subqueries
|
|
603
|
+
if (containsSubquery(expr)) {
|
|
604
|
+
warnings.push('Policy contains subquery which may impact performance');
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
// =============================================================================
|
|
608
|
+
// MAIN POLICY VALIDATION FUNCTION
|
|
609
|
+
// =============================================================================
|
|
610
|
+
/**
|
|
611
|
+
* Validates an RLS policy definition for security and correctness.
|
|
612
|
+
*
|
|
613
|
+
* SECURITY CRITICAL: This is the primary entry point for validating RLS policies
|
|
614
|
+
* before they are applied to the database. All user-provided policy definitions
|
|
615
|
+
* MUST pass through this function.
|
|
616
|
+
*
|
|
617
|
+
* ## Security Checks Performed
|
|
618
|
+
*
|
|
619
|
+
* ### On Policy Names:
|
|
620
|
+
* - SQL injection patterns (semicolons, comments, DDL keywords)
|
|
621
|
+
* - Unicode attacks (null bytes, zero-width, RTL override, homoglyphs)
|
|
622
|
+
* - Length limits (PostgreSQL max 63 characters)
|
|
623
|
+
* - Format validation (must start with letter or underscore)
|
|
624
|
+
*
|
|
625
|
+
* ### On Table Names:
|
|
626
|
+
* - SQL injection patterns
|
|
627
|
+
* - Unicode attacks
|
|
628
|
+
* - Reserved keyword warnings
|
|
629
|
+
*
|
|
630
|
+
* ### On Role Names:
|
|
631
|
+
* - SQL injection patterns
|
|
632
|
+
* - Valid identifier format
|
|
633
|
+
* - Unicode attacks
|
|
634
|
+
*
|
|
635
|
+
* ### On USING/CHECK Expressions:
|
|
636
|
+
* - Dangerous function blocklist (pg_sleep, pg_read_file, dblink, etc.)
|
|
637
|
+
* - DDL privilege escalation (GRANT, CREATE USER, etc.)
|
|
638
|
+
* - Unicode attacks
|
|
639
|
+
* - Bypass pattern warnings (1=1, OR 'x'='x')
|
|
640
|
+
* - Subquery performance warnings
|
|
641
|
+
*
|
|
642
|
+
* ### Semantic Validation:
|
|
643
|
+
* - SELECT/DELETE require USING clause
|
|
644
|
+
* - INSERT requires WITH CHECK clause
|
|
645
|
+
* - Multi-tenant isolation checks (optional)
|
|
646
|
+
*
|
|
647
|
+
* @param policy - The RLS policy definition to validate
|
|
648
|
+
* @param options - Optional validation configuration
|
|
649
|
+
* @returns Validation result with valid flag, errors array, and warnings array
|
|
650
|
+
*/
|
|
651
|
+
export function validatePolicy(policy, options) {
|
|
652
|
+
const errors = [];
|
|
653
|
+
const warnings = [];
|
|
654
|
+
// Validate policy name
|
|
655
|
+
validatePolicyName(policy.name, errors, warnings);
|
|
656
|
+
// Validate table name
|
|
657
|
+
validatePolicyTableName(policy.table, errors, warnings);
|
|
658
|
+
// Validate role names
|
|
659
|
+
if (policy.roles && policy.roles.length > 0) {
|
|
660
|
+
for (const role of policy.roles) {
|
|
661
|
+
if (!isValidRoleName(role)) {
|
|
662
|
+
errors.push('Role name "' + role + '" contains unsafe characters');
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
// Validate operation-specific clause requirements
|
|
667
|
+
if (policy.operation === 'SELECT' || policy.operation === 'DELETE') {
|
|
668
|
+
if (!policy.using) {
|
|
669
|
+
errors.push(policy.operation + ' policy requires USING clause');
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
if (policy.operation === 'INSERT') {
|
|
673
|
+
if (!policy.check) {
|
|
674
|
+
errors.push('INSERT policy requires WITH CHECK clause');
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
// Validate USING clause
|
|
678
|
+
if (policy.using) {
|
|
679
|
+
validatePolicyExpression(policy.using, 'USING', errors, warnings);
|
|
680
|
+
// Additional USING-specific checks
|
|
681
|
+
if (policy.using.trim().toLowerCase() === 'true') {
|
|
682
|
+
warnings.push('USING (true) allows all rows - verify this is intentional');
|
|
683
|
+
}
|
|
684
|
+
if (containsBypassPattern(policy.using)) {
|
|
685
|
+
warnings.push('USING clause contains bypass pattern that may allow all rows');
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
// Validate CHECK clause
|
|
689
|
+
if (policy.check) {
|
|
690
|
+
validatePolicyExpression(policy.check, 'WITH CHECK', errors, warnings);
|
|
691
|
+
}
|
|
692
|
+
// Multi-tenant isolation check
|
|
693
|
+
if (options?.requireTenantIsolation && options.tenantColumn) {
|
|
694
|
+
const tenantColumn = options.tenantColumn;
|
|
695
|
+
const hasInUsing = policy.using?.includes(tenantColumn);
|
|
696
|
+
const hasInCheck = policy.check?.includes(tenantColumn);
|
|
697
|
+
if (!hasInUsing && !hasInCheck) {
|
|
698
|
+
warnings.push('Policy does not include ' + tenantColumn + ' column - multi-tenant isolation may be compromised');
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
return {
|
|
702
|
+
valid: errors.length === 0,
|
|
703
|
+
errors,
|
|
704
|
+
warnings,
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
// =============================================================================
|
|
708
|
+
// RUNTIME SYNTAX VALIDATION
|
|
709
|
+
// =============================================================================
|
|
710
|
+
/**
|
|
711
|
+
* Validates SQL expression syntax using the PostgreSQL database.
|
|
712
|
+
*
|
|
713
|
+
* This function performs two levels of validation:
|
|
714
|
+
*
|
|
715
|
+
* 1. **Syntax Check**: Attempts to parse the expression by wrapping it in a
|
|
716
|
+
* SELECT statement. This catches malformed SQL before it reaches production.
|
|
717
|
+
*
|
|
718
|
+
* 2. **Type Check**: Verifies the expression returns a boolean type, which is
|
|
719
|
+
* required for RLS policy expressions. Non-boolean expressions (like
|
|
720
|
+
* arithmetic operations) will cause policies to fail at runtime.
|
|
721
|
+
*
|
|
722
|
+
* @param pglite - PGlite-compatible database connection
|
|
723
|
+
* @param expression - SQL expression to validate
|
|
724
|
+
* @returns Promise resolving to validation result
|
|
725
|
+
*/
|
|
726
|
+
export async function validatePolicySyntax(pglite, expression) {
|
|
727
|
+
const errors = [];
|
|
728
|
+
const warnings = [];
|
|
729
|
+
// Step 1: Syntax validation - wrap expression in SELECT to parse
|
|
730
|
+
try {
|
|
731
|
+
await pglite.exec('SELECT ' + expression + ' WHERE FALSE');
|
|
732
|
+
}
|
|
733
|
+
catch {
|
|
734
|
+
errors.push('Invalid SQL syntax');
|
|
735
|
+
return { valid: false, errors, warnings };
|
|
736
|
+
}
|
|
737
|
+
// Step 2: Type validation - expression must return boolean
|
|
738
|
+
try {
|
|
739
|
+
const result = await pglite.query('SELECT pg_typeof(' + expression + ')::text as result');
|
|
740
|
+
if (result?.rows?.length > 0) {
|
|
741
|
+
const typeResult = result.rows[0]?.result;
|
|
742
|
+
// pg_typeof returns 'boolean' for boolean expressions
|
|
743
|
+
if (typeResult !== 'boolean') {
|
|
744
|
+
errors.push('Policy expression must return boolean type');
|
|
745
|
+
}
|
|
746
|
+
else if (isArithmeticExpression(expression)) {
|
|
747
|
+
// Edge case: some arithmetic expressions might be coerced to boolean
|
|
748
|
+
// by PostgreSQL, but they're still invalid for RLS policies
|
|
749
|
+
errors.push('Policy expression must return boolean type');
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
catch {
|
|
754
|
+
// Type check failed but syntax passed - expression is syntactically valid
|
|
755
|
+
// but may have runtime issues (e.g., referencing non-existent columns)
|
|
756
|
+
// We allow this to pass since the caller may be validating before table creation
|
|
757
|
+
}
|
|
758
|
+
return {
|
|
759
|
+
valid: errors.length === 0,
|
|
760
|
+
errors,
|
|
761
|
+
warnings,
|
|
762
|
+
};
|
|
763
|
+
}
|
|
764
|
+
// =============================================================================
|
|
765
|
+
// TENANT ID VALIDATION
|
|
766
|
+
// =============================================================================
|
|
767
|
+
/**
|
|
768
|
+
* Validates a tenant ID for safe use in multi-tenant RLS policies.
|
|
769
|
+
*
|
|
770
|
+
* SECURITY CRITICAL: Tenant IDs are often interpolated into SQL expressions
|
|
771
|
+
* for multi-tenant row-level security. This function ensures tenant IDs
|
|
772
|
+
* cannot be exploited for SQL injection.
|
|
773
|
+
*
|
|
774
|
+
* ## Allowed Characters
|
|
775
|
+
* - Letters (a-z, A-Z)
|
|
776
|
+
* - Digits (0-9)
|
|
777
|
+
* - Hyphens (-)
|
|
778
|
+
* - Underscores (_)
|
|
779
|
+
*
|
|
780
|
+
* ## Rejected Patterns
|
|
781
|
+
* - Empty strings
|
|
782
|
+
* - Whitespace
|
|
783
|
+
* - SQL special characters (quotes, semicolons, comments)
|
|
784
|
+
* - Unicode characters (to prevent homoglyph attacks)
|
|
785
|
+
*
|
|
786
|
+
* @param tenantId - The tenant ID to validate
|
|
787
|
+
* @returns true if the tenant ID is safe, false otherwise
|
|
788
|
+
*/
|
|
789
|
+
export function validateTenantId(tenantId) {
|
|
790
|
+
return VALID_TENANT_ID_PATTERN.test(tenantId);
|
|
791
|
+
}
|
|
792
|
+
//# sourceMappingURL=validator.js.map
|