@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,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RLS Auth Integration Module
|
|
3
|
+
*
|
|
4
|
+
* This module integrates Row-Level Security (RLS) with the authentication system,
|
|
5
|
+
* providing:
|
|
6
|
+
* - Automatic RLS context setup from auth tokens
|
|
7
|
+
* - Admin bypass capabilities for privileged operations
|
|
8
|
+
* - Session-scoped tenant isolation
|
|
9
|
+
*
|
|
10
|
+
* @module rls/auth-integration
|
|
11
|
+
*/
|
|
12
|
+
import type { PGliteLike, SetTenantContextOptions } from './policy';
|
|
13
|
+
/**
|
|
14
|
+
* User information extracted from authentication context
|
|
15
|
+
*/
|
|
16
|
+
export interface RLSUser {
|
|
17
|
+
/** User's unique identifier */
|
|
18
|
+
id: string;
|
|
19
|
+
/** User's email address */
|
|
20
|
+
email?: string;
|
|
21
|
+
/** User's roles/permissions */
|
|
22
|
+
roles?: string[];
|
|
23
|
+
/** Organization/tenant the user belongs to */
|
|
24
|
+
tenantId?: string;
|
|
25
|
+
/** Whether user has admin privileges */
|
|
26
|
+
isAdmin?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* RLS context that tracks the current security state
|
|
30
|
+
*/
|
|
31
|
+
export interface RLSContext {
|
|
32
|
+
/** Current authenticated user */
|
|
33
|
+
user: RLSUser | null;
|
|
34
|
+
/** Current tenant ID if set */
|
|
35
|
+
tenantId: string | null;
|
|
36
|
+
/** Whether RLS is currently bypassed */
|
|
37
|
+
isBypassed: boolean;
|
|
38
|
+
/** Reason for current bypass if any */
|
|
39
|
+
bypassReason?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Options for setting up RLS from auth context
|
|
43
|
+
*/
|
|
44
|
+
export interface SetupRLSFromAuthOptions {
|
|
45
|
+
/** Session variable for user ID (default: 'app.user_id') */
|
|
46
|
+
userIdVariable?: string;
|
|
47
|
+
/** Session variable for tenant ID (default: 'app.tenant_id') */
|
|
48
|
+
tenantIdVariable?: string;
|
|
49
|
+
/** Session variable for roles (default: 'app.roles') */
|
|
50
|
+
rolesVariable?: string;
|
|
51
|
+
/** Whether to set context as LOCAL (transaction-scoped) */
|
|
52
|
+
local?: boolean;
|
|
53
|
+
/** Extract tenant ID from user if not explicitly provided */
|
|
54
|
+
autoExtractTenant?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Options for admin bypass
|
|
58
|
+
*/
|
|
59
|
+
export interface AdminBypassOptions {
|
|
60
|
+
/** Reason for the bypass (for audit logging) */
|
|
61
|
+
reason: string;
|
|
62
|
+
/** Maximum duration of bypass in milliseconds (default: 30000 = 30 seconds) */
|
|
63
|
+
maxDuration?: number;
|
|
64
|
+
/** Callback when bypass is activated */
|
|
65
|
+
onBypassStart?: (context: RLSContext) => void;
|
|
66
|
+
/** Callback when bypass is deactivated */
|
|
67
|
+
onBypassEnd?: (context: RLSContext) => void;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Result of an admin operation with bypass
|
|
71
|
+
*/
|
|
72
|
+
export interface AdminOperationResult<T> {
|
|
73
|
+
/** Whether the operation succeeded */
|
|
74
|
+
success: boolean;
|
|
75
|
+
/** Result data if successful */
|
|
76
|
+
data?: T;
|
|
77
|
+
/** Error if operation failed */
|
|
78
|
+
error?: Error;
|
|
79
|
+
/** Duration of the bypass in milliseconds */
|
|
80
|
+
bypassDuration: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Manages RLS context for a database connection.
|
|
84
|
+
*
|
|
85
|
+
* This class provides methods to:
|
|
86
|
+
* - Set up RLS context from authentication
|
|
87
|
+
* - Manage admin bypass for privileged operations
|
|
88
|
+
* - Track current security state
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const manager = new RLSContextManager(pglite)
|
|
93
|
+
*
|
|
94
|
+
* // Set up context from authenticated user
|
|
95
|
+
* await manager.setupFromAuth({
|
|
96
|
+
* id: 'user-123',
|
|
97
|
+
* tenantId: 'tenant-456',
|
|
98
|
+
* roles: ['user']
|
|
99
|
+
* })
|
|
100
|
+
*
|
|
101
|
+
* // Now queries will be filtered by RLS policies
|
|
102
|
+
* const results = await pglite.query('SELECT * FROM orders')
|
|
103
|
+
*
|
|
104
|
+
* // Admin can bypass RLS for specific operations
|
|
105
|
+
* await manager.withAdminBypass(
|
|
106
|
+
* { reason: 'Support ticket #789' },
|
|
107
|
+
* async () => {
|
|
108
|
+
* // This operation sees all rows
|
|
109
|
+
* return await pglite.query('SELECT * FROM orders')
|
|
110
|
+
* }
|
|
111
|
+
* )
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare class RLSContextManager {
|
|
115
|
+
private pglite;
|
|
116
|
+
private context;
|
|
117
|
+
private bypassTimeout;
|
|
118
|
+
constructor(pglite: PGliteLike);
|
|
119
|
+
/**
|
|
120
|
+
* Get the current RLS context state
|
|
121
|
+
*/
|
|
122
|
+
getContext(): Readonly<RLSContext>;
|
|
123
|
+
/**
|
|
124
|
+
* Check if the current user has admin privileges
|
|
125
|
+
*/
|
|
126
|
+
isAdmin(): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Check if RLS is currently bypassed
|
|
129
|
+
*/
|
|
130
|
+
isBypassed(): boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Set up RLS context from an authenticated user.
|
|
133
|
+
*
|
|
134
|
+
* This sets PostgreSQL session variables that RLS policies can reference
|
|
135
|
+
* to filter data based on the current user's identity and permissions.
|
|
136
|
+
*
|
|
137
|
+
* @param user - Authenticated user information
|
|
138
|
+
* @param options - Configuration options
|
|
139
|
+
*
|
|
140
|
+
* @throws {Error} If user ID or tenant ID contains invalid characters
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```typescript
|
|
144
|
+
* await manager.setupFromAuth({
|
|
145
|
+
* id: 'user-123',
|
|
146
|
+
* email: 'user@example.com',
|
|
147
|
+
* tenantId: 'tenant-456',
|
|
148
|
+
* roles: ['user', 'editor']
|
|
149
|
+
* })
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
setupFromAuth(user: RLSUser, options?: SetupRLSFromAuthOptions): Promise<void>;
|
|
153
|
+
/**
|
|
154
|
+
* Clear the current RLS context.
|
|
155
|
+
*
|
|
156
|
+
* Resets all session variables to their defaults, removing any
|
|
157
|
+
* user-specific filtering from subsequent queries.
|
|
158
|
+
*
|
|
159
|
+
* @param options - Configuration options
|
|
160
|
+
*/
|
|
161
|
+
clearContext(options?: SetTenantContextOptions): Promise<void>;
|
|
162
|
+
/**
|
|
163
|
+
* Execute an operation with RLS bypassed (admin only).
|
|
164
|
+
*
|
|
165
|
+
* This temporarily disables RLS filtering for privileged operations
|
|
166
|
+
* like admin dashboards, support tools, or data migrations.
|
|
167
|
+
*
|
|
168
|
+
* @security This method enforces several safeguards:
|
|
169
|
+
* - Only users with admin privileges can bypass RLS
|
|
170
|
+
* - Bypass has a maximum duration (default: 30 seconds)
|
|
171
|
+
* - Bypass reason is required for audit logging
|
|
172
|
+
* - Bypass is automatically cleared after operation completes
|
|
173
|
+
*
|
|
174
|
+
* @param options - Bypass configuration
|
|
175
|
+
* @param operation - Async function to execute with bypass
|
|
176
|
+
* @returns Result of the operation including bypass duration
|
|
177
|
+
*
|
|
178
|
+
* @throws {Error} If user is not an admin
|
|
179
|
+
* @throws {Error} If bypass duration exceeds maximum
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const result = await manager.withAdminBypass(
|
|
184
|
+
* { reason: 'Support ticket #12345' },
|
|
185
|
+
* async () => {
|
|
186
|
+
* // This query bypasses RLS and sees all data
|
|
187
|
+
* const allOrders = await pglite.query('SELECT * FROM orders')
|
|
188
|
+
* return allOrders.rows
|
|
189
|
+
* }
|
|
190
|
+
* )
|
|
191
|
+
*
|
|
192
|
+
* if (result.success) {
|
|
193
|
+
* console.log('Found', result.data.length, 'orders')
|
|
194
|
+
* console.log('Bypass duration:', result.bypassDuration, 'ms')
|
|
195
|
+
* }
|
|
196
|
+
* ```
|
|
197
|
+
*/
|
|
198
|
+
withAdminBypass<T>(options: AdminBypassOptions, operation: () => Promise<T>): Promise<AdminOperationResult<T>>;
|
|
199
|
+
/**
|
|
200
|
+
* Deactivate RLS bypass
|
|
201
|
+
*/
|
|
202
|
+
private deactivateBypass;
|
|
203
|
+
/**
|
|
204
|
+
* Dispose of the context manager
|
|
205
|
+
*/
|
|
206
|
+
dispose(): void;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Create an RLS policy expression that checks for admin bypass.
|
|
210
|
+
*
|
|
211
|
+
* Use this in your policy USING clauses to allow admins to bypass RLS:
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```sql
|
|
215
|
+
* CREATE POLICY tenant_isolation ON orders
|
|
216
|
+
* AS PERMISSIVE
|
|
217
|
+
* FOR ALL
|
|
218
|
+
* TO public
|
|
219
|
+
* USING (
|
|
220
|
+
* current_setting('app.rls_bypass', true) = 'true'
|
|
221
|
+
* OR tenant_id = current_setting('app.tenant_id')::uuid
|
|
222
|
+
* );
|
|
223
|
+
* ```
|
|
224
|
+
*
|
|
225
|
+
* @returns SQL expression for admin bypass check
|
|
226
|
+
*/
|
|
227
|
+
export declare function createAdminBypassCheck(): string;
|
|
228
|
+
/**
|
|
229
|
+
* Create an RLS policy expression with admin bypass and tenant isolation.
|
|
230
|
+
*
|
|
231
|
+
* @param tenantColumn - Name of the tenant column
|
|
232
|
+
* @param sessionVariable - Session variable containing tenant ID (default: 'app.tenant_id')
|
|
233
|
+
* @returns SQL expression for policy USING clause
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* ```typescript
|
|
237
|
+
* const using = createTenantPolicyWithBypass('tenant_id')
|
|
238
|
+
* // Returns: "current_setting('app.rls_bypass', true) = 'true' OR tenant_id = current_setting('app.tenant_id')::text"
|
|
239
|
+
* ```
|
|
240
|
+
*/
|
|
241
|
+
export declare function createTenantPolicyWithBypass(tenantColumn: string, sessionVariable?: string): string;
|
|
242
|
+
/**
|
|
243
|
+
* Create an RLS policy expression for owner-based access with admin bypass.
|
|
244
|
+
*
|
|
245
|
+
* @param ownerColumn - Name of the owner/user column
|
|
246
|
+
* @param sessionVariable - Session variable containing user ID (default: 'app.user_id')
|
|
247
|
+
* @returns SQL expression for policy USING clause
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
* ```typescript
|
|
251
|
+
* const using = createOwnerPolicyWithBypass('user_id')
|
|
252
|
+
* // Returns: "current_setting('app.rls_bypass', true) = 'true' OR user_id = current_setting('app.user_id')::text"
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
export declare function createOwnerPolicyWithBypass(ownerColumn: string, sessionVariable?: string): string;
|
|
256
|
+
/**
|
|
257
|
+
* Validate that a user has the required role.
|
|
258
|
+
*
|
|
259
|
+
* @param user - User to check
|
|
260
|
+
* @param requiredRole - Role that must be present
|
|
261
|
+
* @returns true if user has the required role
|
|
262
|
+
*/
|
|
263
|
+
export declare function hasRole(user: RLSUser, requiredRole: string): boolean;
|
|
264
|
+
/**
|
|
265
|
+
* Validate that a user has any of the required roles.
|
|
266
|
+
*
|
|
267
|
+
* @param user - User to check
|
|
268
|
+
* @param requiredRoles - Array of acceptable roles
|
|
269
|
+
* @returns true if user has any of the required roles
|
|
270
|
+
*/
|
|
271
|
+
export declare function hasAnyRole(user: RLSUser, requiredRoles: string[]): boolean;
|
|
272
|
+
/**
|
|
273
|
+
* Validate that a user has all of the required roles.
|
|
274
|
+
*
|
|
275
|
+
* @param user - User to check
|
|
276
|
+
* @param requiredRoles - Array of required roles
|
|
277
|
+
* @returns true if user has all required roles
|
|
278
|
+
*/
|
|
279
|
+
export declare function hasAllRoles(user: RLSUser, requiredRoles: string[]): boolean;
|
|
280
|
+
//# sourceMappingURL=auth-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-integration.d.ts","sourceRoot":"","sources":["../../src/rls/auth-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RLS Auth Integration Module
|
|
3
|
+
*
|
|
4
|
+
* This module integrates Row-Level Security (RLS) with the authentication system,
|
|
5
|
+
* providing:
|
|
6
|
+
* - Automatic RLS context setup from auth tokens
|
|
7
|
+
* - Admin bypass capabilities for privileged operations
|
|
8
|
+
* - Session-scoped tenant isolation
|
|
9
|
+
*
|
|
10
|
+
* @module rls/auth-integration
|
|
11
|
+
*/
|
|
12
|
+
import { setTenantContext, clearTenantContext } from './index';
|
|
13
|
+
import { validateTenantId } from './validator';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Constants
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/** Default session variable for user ID */
|
|
18
|
+
const DEFAULT_USER_ID_VARIABLE = 'app.user_id';
|
|
19
|
+
/** Default session variable for tenant ID */
|
|
20
|
+
const DEFAULT_TENANT_ID_VARIABLE = 'app.tenant_id';
|
|
21
|
+
/** Default session variable for roles */
|
|
22
|
+
const DEFAULT_ROLES_VARIABLE = 'app.roles';
|
|
23
|
+
/** Maximum bypass duration (5 minutes) */
|
|
24
|
+
const MAX_BYPASS_DURATION = 5 * 60 * 1000;
|
|
25
|
+
/** Default bypass duration (30 seconds) */
|
|
26
|
+
const DEFAULT_BYPASS_DURATION = 30 * 1000;
|
|
27
|
+
/** Admin role identifier */
|
|
28
|
+
const ADMIN_ROLE = 'admin';
|
|
29
|
+
/** Super admin role identifier */
|
|
30
|
+
const SUPER_ADMIN_ROLE = 'super_admin';
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// RLS Context Manager
|
|
33
|
+
// ============================================================================
|
|
34
|
+
/**
|
|
35
|
+
* Manages RLS context for a database connection.
|
|
36
|
+
*
|
|
37
|
+
* This class provides methods to:
|
|
38
|
+
* - Set up RLS context from authentication
|
|
39
|
+
* - Manage admin bypass for privileged operations
|
|
40
|
+
* - Track current security state
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const manager = new RLSContextManager(pglite)
|
|
45
|
+
*
|
|
46
|
+
* // Set up context from authenticated user
|
|
47
|
+
* await manager.setupFromAuth({
|
|
48
|
+
* id: 'user-123',
|
|
49
|
+
* tenantId: 'tenant-456',
|
|
50
|
+
* roles: ['user']
|
|
51
|
+
* })
|
|
52
|
+
*
|
|
53
|
+
* // Now queries will be filtered by RLS policies
|
|
54
|
+
* const results = await pglite.query('SELECT * FROM orders')
|
|
55
|
+
*
|
|
56
|
+
* // Admin can bypass RLS for specific operations
|
|
57
|
+
* await manager.withAdminBypass(
|
|
58
|
+
* { reason: 'Support ticket #789' },
|
|
59
|
+
* async () => {
|
|
60
|
+
* // This operation sees all rows
|
|
61
|
+
* return await pglite.query('SELECT * FROM orders')
|
|
62
|
+
* }
|
|
63
|
+
* )
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export class RLSContextManager {
|
|
67
|
+
pglite;
|
|
68
|
+
context;
|
|
69
|
+
bypassTimeout = null;
|
|
70
|
+
constructor(pglite) {
|
|
71
|
+
this.pglite = pglite;
|
|
72
|
+
this.context = {
|
|
73
|
+
user: null,
|
|
74
|
+
tenantId: null,
|
|
75
|
+
isBypassed: false,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the current RLS context state
|
|
80
|
+
*/
|
|
81
|
+
getContext() {
|
|
82
|
+
return { ...this.context };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if the current user has admin privileges
|
|
86
|
+
*/
|
|
87
|
+
isAdmin() {
|
|
88
|
+
if (!this.context.user)
|
|
89
|
+
return false;
|
|
90
|
+
if (this.context.user.isAdmin)
|
|
91
|
+
return true;
|
|
92
|
+
const roles = this.context.user.roles || [];
|
|
93
|
+
return roles.includes(ADMIN_ROLE) || roles.includes(SUPER_ADMIN_ROLE);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check if RLS is currently bypassed
|
|
97
|
+
*/
|
|
98
|
+
isBypassed() {
|
|
99
|
+
return this.context.isBypassed;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Set up RLS context from an authenticated user.
|
|
103
|
+
*
|
|
104
|
+
* This sets PostgreSQL session variables that RLS policies can reference
|
|
105
|
+
* to filter data based on the current user's identity and permissions.
|
|
106
|
+
*
|
|
107
|
+
* @param user - Authenticated user information
|
|
108
|
+
* @param options - Configuration options
|
|
109
|
+
*
|
|
110
|
+
* @throws {Error} If user ID or tenant ID contains invalid characters
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* await manager.setupFromAuth({
|
|
115
|
+
* id: 'user-123',
|
|
116
|
+
* email: 'user@example.com',
|
|
117
|
+
* tenantId: 'tenant-456',
|
|
118
|
+
* roles: ['user', 'editor']
|
|
119
|
+
* })
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
async setupFromAuth(user, options) {
|
|
123
|
+
const { userIdVariable = DEFAULT_USER_ID_VARIABLE, tenantIdVariable = DEFAULT_TENANT_ID_VARIABLE, rolesVariable = DEFAULT_ROLES_VARIABLE, local = false, autoExtractTenant = true, } = options || {};
|
|
124
|
+
// Validate user ID
|
|
125
|
+
if (!validateTenantId(user.id)) {
|
|
126
|
+
throw new Error('Invalid user ID - contains unsafe characters');
|
|
127
|
+
}
|
|
128
|
+
// Set user ID
|
|
129
|
+
const localKeyword = local ? 'LOCAL ' : '';
|
|
130
|
+
await this.pglite.exec(`SET ${localKeyword}${userIdVariable} = '${user.id}'`);
|
|
131
|
+
// Determine tenant ID
|
|
132
|
+
let tenantId = user.tenantId;
|
|
133
|
+
if (!tenantId && autoExtractTenant && user.id) {
|
|
134
|
+
// Some systems encode tenant in user ID (e.g., "tenant_user" format)
|
|
135
|
+
// Default: use user ID as tenant ID for single-tenant scenarios
|
|
136
|
+
tenantId = user.id;
|
|
137
|
+
}
|
|
138
|
+
// Set tenant ID if available
|
|
139
|
+
if (tenantId) {
|
|
140
|
+
if (!validateTenantId(tenantId)) {
|
|
141
|
+
throw new Error('Invalid tenant ID - contains unsafe characters');
|
|
142
|
+
}
|
|
143
|
+
await setTenantContext(this.pglite, tenantId, {
|
|
144
|
+
sessionVariable: tenantIdVariable,
|
|
145
|
+
local,
|
|
146
|
+
});
|
|
147
|
+
this.context.tenantId = tenantId;
|
|
148
|
+
}
|
|
149
|
+
// Set roles if available
|
|
150
|
+
if (user.roles && user.roles.length > 0) {
|
|
151
|
+
// Validate each role
|
|
152
|
+
for (const role of user.roles) {
|
|
153
|
+
if (!validateTenantId(role)) {
|
|
154
|
+
throw new Error(`Invalid role "${role}" - contains unsafe characters`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const rolesArray = `{${user.roles.join(',')}}`;
|
|
158
|
+
await this.pglite.exec(`SET ${localKeyword}${rolesVariable} = '${rolesArray}'`);
|
|
159
|
+
}
|
|
160
|
+
// Update context
|
|
161
|
+
this.context.user = user;
|
|
162
|
+
this.context.isBypassed = false;
|
|
163
|
+
delete this.context.bypassReason;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Clear the current RLS context.
|
|
167
|
+
*
|
|
168
|
+
* Resets all session variables to their defaults, removing any
|
|
169
|
+
* user-specific filtering from subsequent queries.
|
|
170
|
+
*
|
|
171
|
+
* @param options - Configuration options
|
|
172
|
+
*/
|
|
173
|
+
async clearContext(options) {
|
|
174
|
+
const userIdVariable = options?.sessionVariable || DEFAULT_USER_ID_VARIABLE;
|
|
175
|
+
const tenantIdVariable = DEFAULT_TENANT_ID_VARIABLE;
|
|
176
|
+
const rolesVariable = DEFAULT_ROLES_VARIABLE;
|
|
177
|
+
await this.pglite.exec(`RESET ${userIdVariable}`);
|
|
178
|
+
await clearTenantContext(this.pglite, { sessionVariable: tenantIdVariable });
|
|
179
|
+
await this.pglite.exec(`RESET ${rolesVariable}`);
|
|
180
|
+
this.context = {
|
|
181
|
+
user: null,
|
|
182
|
+
tenantId: null,
|
|
183
|
+
isBypassed: false,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Execute an operation with RLS bypassed (admin only).
|
|
188
|
+
*
|
|
189
|
+
* This temporarily disables RLS filtering for privileged operations
|
|
190
|
+
* like admin dashboards, support tools, or data migrations.
|
|
191
|
+
*
|
|
192
|
+
* @security This method enforces several safeguards:
|
|
193
|
+
* - Only users with admin privileges can bypass RLS
|
|
194
|
+
* - Bypass has a maximum duration (default: 30 seconds)
|
|
195
|
+
* - Bypass reason is required for audit logging
|
|
196
|
+
* - Bypass is automatically cleared after operation completes
|
|
197
|
+
*
|
|
198
|
+
* @param options - Bypass configuration
|
|
199
|
+
* @param operation - Async function to execute with bypass
|
|
200
|
+
* @returns Result of the operation including bypass duration
|
|
201
|
+
*
|
|
202
|
+
* @throws {Error} If user is not an admin
|
|
203
|
+
* @throws {Error} If bypass duration exceeds maximum
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* ```typescript
|
|
207
|
+
* const result = await manager.withAdminBypass(
|
|
208
|
+
* { reason: 'Support ticket #12345' },
|
|
209
|
+
* async () => {
|
|
210
|
+
* // This query bypasses RLS and sees all data
|
|
211
|
+
* const allOrders = await pglite.query('SELECT * FROM orders')
|
|
212
|
+
* return allOrders.rows
|
|
213
|
+
* }
|
|
214
|
+
* )
|
|
215
|
+
*
|
|
216
|
+
* if (result.success) {
|
|
217
|
+
* console.log('Found', result.data.length, 'orders')
|
|
218
|
+
* console.log('Bypass duration:', result.bypassDuration, 'ms')
|
|
219
|
+
* }
|
|
220
|
+
* ```
|
|
221
|
+
*/
|
|
222
|
+
async withAdminBypass(options, operation) {
|
|
223
|
+
// Security: Verify admin privileges
|
|
224
|
+
if (!this.isAdmin()) {
|
|
225
|
+
return {
|
|
226
|
+
success: false,
|
|
227
|
+
error: new Error('Admin privileges required for RLS bypass'),
|
|
228
|
+
bypassDuration: 0,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// Security: Validate and cap bypass duration
|
|
232
|
+
const maxDuration = Math.min(options.maxDuration || DEFAULT_BYPASS_DURATION, MAX_BYPASS_DURATION);
|
|
233
|
+
// Record start time
|
|
234
|
+
const startTime = Date.now();
|
|
235
|
+
// Activate bypass
|
|
236
|
+
this.context.isBypassed = true;
|
|
237
|
+
this.context.bypassReason = options.reason;
|
|
238
|
+
// Set up safety timeout to auto-clear bypass
|
|
239
|
+
this.bypassTimeout = setTimeout(() => {
|
|
240
|
+
this.deactivateBypass();
|
|
241
|
+
}, maxDuration);
|
|
242
|
+
// Notify bypass start
|
|
243
|
+
if (options.onBypassStart) {
|
|
244
|
+
options.onBypassStart(this.getContext());
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
// Set PostgreSQL session to bypass RLS
|
|
248
|
+
// Using a special "admin mode" session variable
|
|
249
|
+
await this.pglite.exec(`SET app.rls_bypass = 'true'`);
|
|
250
|
+
await this.pglite.exec(`SET app.bypass_reason = '${options.reason.replace(/'/g, "''")}'`);
|
|
251
|
+
// Execute the operation
|
|
252
|
+
const data = await operation();
|
|
253
|
+
return {
|
|
254
|
+
success: true,
|
|
255
|
+
data,
|
|
256
|
+
bypassDuration: Date.now() - startTime,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
return {
|
|
261
|
+
success: false,
|
|
262
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
263
|
+
bypassDuration: Date.now() - startTime,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
// Always deactivate bypass
|
|
268
|
+
await this.deactivateBypass();
|
|
269
|
+
// Notify bypass end
|
|
270
|
+
if (options.onBypassEnd) {
|
|
271
|
+
options.onBypassEnd(this.getContext());
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Deactivate RLS bypass
|
|
277
|
+
*/
|
|
278
|
+
async deactivateBypass() {
|
|
279
|
+
// Clear safety timeout
|
|
280
|
+
if (this.bypassTimeout) {
|
|
281
|
+
clearTimeout(this.bypassTimeout);
|
|
282
|
+
this.bypassTimeout = null;
|
|
283
|
+
}
|
|
284
|
+
// Reset bypass session variables
|
|
285
|
+
try {
|
|
286
|
+
await this.pglite.exec(`RESET app.rls_bypass`);
|
|
287
|
+
await this.pglite.exec(`RESET app.bypass_reason`);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// Ignore errors during cleanup
|
|
291
|
+
}
|
|
292
|
+
// Update context
|
|
293
|
+
this.context.isBypassed = false;
|
|
294
|
+
delete this.context.bypassReason;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Dispose of the context manager
|
|
298
|
+
*/
|
|
299
|
+
dispose() {
|
|
300
|
+
if (this.bypassTimeout) {
|
|
301
|
+
clearTimeout(this.bypassTimeout);
|
|
302
|
+
this.bypassTimeout = null;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// ============================================================================
|
|
307
|
+
// Helper Functions
|
|
308
|
+
// ============================================================================
|
|
309
|
+
/**
|
|
310
|
+
* Create an RLS policy expression that checks for admin bypass.
|
|
311
|
+
*
|
|
312
|
+
* Use this in your policy USING clauses to allow admins to bypass RLS:
|
|
313
|
+
*
|
|
314
|
+
* @example
|
|
315
|
+
* ```sql
|
|
316
|
+
* CREATE POLICY tenant_isolation ON orders
|
|
317
|
+
* AS PERMISSIVE
|
|
318
|
+
* FOR ALL
|
|
319
|
+
* TO public
|
|
320
|
+
* USING (
|
|
321
|
+
* current_setting('app.rls_bypass', true) = 'true'
|
|
322
|
+
* OR tenant_id = current_setting('app.tenant_id')::uuid
|
|
323
|
+
* );
|
|
324
|
+
* ```
|
|
325
|
+
*
|
|
326
|
+
* @returns SQL expression for admin bypass check
|
|
327
|
+
*/
|
|
328
|
+
export function createAdminBypassCheck() {
|
|
329
|
+
return `current_setting('app.rls_bypass', true) = 'true'`;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Create an RLS policy expression with admin bypass and tenant isolation.
|
|
333
|
+
*
|
|
334
|
+
* @param tenantColumn - Name of the tenant column
|
|
335
|
+
* @param sessionVariable - Session variable containing tenant ID (default: 'app.tenant_id')
|
|
336
|
+
* @returns SQL expression for policy USING clause
|
|
337
|
+
*
|
|
338
|
+
* @example
|
|
339
|
+
* ```typescript
|
|
340
|
+
* const using = createTenantPolicyWithBypass('tenant_id')
|
|
341
|
+
* // Returns: "current_setting('app.rls_bypass', true) = 'true' OR tenant_id = current_setting('app.tenant_id')::text"
|
|
342
|
+
* ```
|
|
343
|
+
*/
|
|
344
|
+
export function createTenantPolicyWithBypass(tenantColumn, sessionVariable = 'app.tenant_id') {
|
|
345
|
+
return `${createAdminBypassCheck()} OR ${tenantColumn} = current_setting('${sessionVariable}')::text`;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Create an RLS policy expression for owner-based access with admin bypass.
|
|
349
|
+
*
|
|
350
|
+
* @param ownerColumn - Name of the owner/user column
|
|
351
|
+
* @param sessionVariable - Session variable containing user ID (default: 'app.user_id')
|
|
352
|
+
* @returns SQL expression for policy USING clause
|
|
353
|
+
*
|
|
354
|
+
* @example
|
|
355
|
+
* ```typescript
|
|
356
|
+
* const using = createOwnerPolicyWithBypass('user_id')
|
|
357
|
+
* // Returns: "current_setting('app.rls_bypass', true) = 'true' OR user_id = current_setting('app.user_id')::text"
|
|
358
|
+
* ```
|
|
359
|
+
*/
|
|
360
|
+
export function createOwnerPolicyWithBypass(ownerColumn, sessionVariable = 'app.user_id') {
|
|
361
|
+
return `${createAdminBypassCheck()} OR ${ownerColumn} = current_setting('${sessionVariable}')::text`;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Validate that a user has the required role.
|
|
365
|
+
*
|
|
366
|
+
* @param user - User to check
|
|
367
|
+
* @param requiredRole - Role that must be present
|
|
368
|
+
* @returns true if user has the required role
|
|
369
|
+
*/
|
|
370
|
+
export function hasRole(user, requiredRole) {
|
|
371
|
+
if (!user.roles)
|
|
372
|
+
return false;
|
|
373
|
+
return user.roles.includes(requiredRole);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Validate that a user has any of the required roles.
|
|
377
|
+
*
|
|
378
|
+
* @param user - User to check
|
|
379
|
+
* @param requiredRoles - Array of acceptable roles
|
|
380
|
+
* @returns true if user has any of the required roles
|
|
381
|
+
*/
|
|
382
|
+
export function hasAnyRole(user, requiredRoles) {
|
|
383
|
+
if (!user.roles)
|
|
384
|
+
return false;
|
|
385
|
+
return requiredRoles.some((role) => user.roles?.includes(role));
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Validate that a user has all of the required roles.
|
|
389
|
+
*
|
|
390
|
+
* @param user - User to check
|
|
391
|
+
* @param requiredRoles - Array of required roles
|
|
392
|
+
* @returns true if user has all required roles
|
|
393
|
+
*/
|
|
394
|
+
export function hasAllRoles(user, requiredRoles) {
|
|
395
|
+
if (!user.roles)
|
|
396
|
+
return false;
|
|
397
|
+
return requiredRoles.every((role) => user.roles?.includes(role));
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=auth-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-integration.js","sourceRoot":"","sources":["../../src/rls/auth-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAgF9C,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,2CAA2C;AAC3C,MAAM,wBAAwB,GAAG,aAAa,CAAA;AAE9C,6CAA6C;AAC7C,MAAM,0BAA0B,GAAG,eAAe,CAAA;AAElD,yCAAyC;AACzC,MAAM,sBAAsB,GAAG,WAAW,CAAA;AAE1C,0CAA0C;AAC1C,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAEzC,2CAA2C;AAC3C,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAA;AAEzC,4BAA4B;AAC5B,MAAM,UAAU,GAAG,OAAO,CAAA;AAE1B,kCAAkC;AAClC,MAAM,gBAAgB,GAAG,aAAa,CAAA;AAEtC,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAY;IAClB,OAAO,CAAY;IACnB,aAAa,GAAyC,IAAI,CAAA;IAElE,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,KAAK;SAClB,CAAA;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;IAC5B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;YAAE,OAAO,KAAK,CAAA;QACpC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QAC3C,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IACvE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAA;IAChC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,KAAK,CAAC,aAAa,CAAC,IAAa,EAAE,OAAiC;QAClE,MAAM,EACJ,cAAc,GAAG,wBAAwB,EACzC,gBAAgB,GAAG,0BAA0B,EAC7C,aAAa,GAAG,sBAAsB,EACtC,KAAK,GAAG,KAAK,EACb,iBAAiB,GAAG,IAAI,GACzB,GAAG,OAAO,IAAI,EAAE,CAAA;QAEjB,mBAAmB;QACnB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QACjE,CAAC;QAED,cAAc;QACd,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,YAAY,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;QAE7E,sBAAsB;QACtB,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC5B,IAAI,CAAC,QAAQ,IAAI,iBAAiB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YAC9C,qEAAqE;YACrE,gEAAgE;YAChE,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAA;QACpB,CAAC;QAED,6BAA6B;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;YACnE,CAAC;YACD,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;gBAC5C,eAAe,EAAE,gBAAgB;gBACjC,KAAK;aACN,CAAC,CAAA;YACF,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAClC,CAAC;QAED,yBAAyB;QACzB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,qBAAqB;YACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,gCAAgC,CAAC,CAAA;gBACxE,CAAC;YACH,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;YAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,YAAY,GAAG,aAAa,OAAO,UAAU,GAAG,CAAC,CAAA;QACjF,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAA;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAA;IAClC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAAC,OAAiC;QAClD,MAAM,cAAc,GAAG,OAAO,EAAE,eAAe,IAAI,wBAAwB,CAAA;QAC3E,MAAM,gBAAgB,GAAG,0BAA0B,CAAA;QACnD,MAAM,aAAa,GAAG,sBAAsB,CAAA;QAE5C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,cAAc,EAAE,CAAC,CAAA;QACjD,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC,CAAA;QAC5E,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,aAAa,EAAE,CAAC,CAAA;QAEhD,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,KAAK;SAClB,CAAA;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,KAAK,CAAC,eAAe,CACnB,OAA2B,EAC3B,SAA2B;QAE3B,oCAAoC;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,KAAK,CAAC,0CAA0C,CAAC;gBAC5D,cAAc,EAAE,CAAC;aAClB,CAAA;QACH,CAAC;QAED,6CAA6C;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,OAAO,CAAC,WAAW,IAAI,uBAAuB,EAC9C,mBAAmB,CACpB,CAAA;QAED,oBAAoB;QACpB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAE5B,kBAAkB;QAClB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAA;QAC9B,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAA;QAE1C,6CAA6C;QAC7C,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzB,CAAC,EAAE,WAAW,CAAC,CAAA;QAEf,sBAAsB;QACtB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;QAC1C,CAAC;QAED,IAAI,CAAC;YACH,uCAAuC;YACvC,gDAAgD;YAChD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;YACrD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;YAEzF,wBAAwB;YACxB,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAA;YAE9B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI;gBACJ,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACvC,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChE,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACvC,CAAA;QACH,CAAC;gBAAS,CAAC;YACT,2BAA2B;YAC3B,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;YAE7B,oBAAoB;YACpB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB;QAC5B,uBAAuB;QACvB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAC3B,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;YAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAA;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAA;IAClC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAC3B,CAAC;IACH,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,kDAAkD,CAAA;AAC3D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,4BAA4B,CAC1C,YAAoB,EACpB,eAAe,GAAG,eAAe;IAEjC,OAAO,GAAG,sBAAsB,EAAE,OAAO,YAAY,uBAAuB,eAAe,UAAU,CAAA;AACvG,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,2BAA2B,CACzC,WAAmB,EACnB,eAAe,GAAG,aAAa;IAE/B,OAAO,GAAG,sBAAsB,EAAE,OAAO,WAAW,uBAAuB,eAAe,UAAU,CAAA;AACtG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,IAAa,EAAE,YAAoB;IACzD,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,IAAa,EAAE,aAAuB;IAC/D,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IAC7B,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;AACjE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,aAAuB;IAChE,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IAC7B,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;AAClE,CAAC"}
|