@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,951 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* R2 Bucket Organization for Iceberg Tables
|
|
3
|
+
* Task: postgres-jw4 - R2 bucket organization for Iceberg tables
|
|
4
|
+
*
|
|
5
|
+
* Defines R2 bucket structure for efficient Iceberg table storage and access.
|
|
6
|
+
* Implements:
|
|
7
|
+
* - Bucket naming and lifecycle conventions
|
|
8
|
+
* - Efficient prefix structure for listing operations
|
|
9
|
+
* - Multi-tenant organization with access control
|
|
10
|
+
* - Cost optimization through tiering
|
|
11
|
+
*
|
|
12
|
+
* ## Bucket Structure
|
|
13
|
+
*
|
|
14
|
+
* ```
|
|
15
|
+
* postgres-iceberg-{env}/ # Iceberg tables bucket
|
|
16
|
+
* {namespace}/ # Namespace (tenant/org/project)
|
|
17
|
+
* {table}/ # Table name
|
|
18
|
+
* metadata/ # Table metadata files
|
|
19
|
+
* version-hint.text # Current metadata version pointer
|
|
20
|
+
* v{n}.metadata.json # Versioned metadata files
|
|
21
|
+
* {snapshot-id}-m{n}-{uuid}.avro # Manifest files
|
|
22
|
+
* snap-{snapshot-id}-{uuid}.avro # Manifest lists
|
|
23
|
+
* data/ # Data files organized by partition
|
|
24
|
+
* do_id_partition={doId}/
|
|
25
|
+
* timestamp_day={day}/
|
|
26
|
+
* data-{timestamp}-{uuid}.parquet
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* ## Access Patterns Optimized For
|
|
30
|
+
* - List all tables in a namespace
|
|
31
|
+
* - List all metadata versions for a table
|
|
32
|
+
* - List data files for a specific partition
|
|
33
|
+
* - Time-travel queries via metadata version scanning
|
|
34
|
+
* - Point-in-time recovery via snapshot history
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Environment types for bucket naming
|
|
39
|
+
*/
|
|
40
|
+
export type R2Environment = 'prod' | 'staging' | 'dev' | 'test'
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Bucket type for organizing different data categories
|
|
44
|
+
*/
|
|
45
|
+
export type R2BucketType = 'iceberg' | 'wal' | 'snapshots'
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Configuration for R2 bucket organization
|
|
49
|
+
*/
|
|
50
|
+
export interface R2BucketConfig {
|
|
51
|
+
/** Environment (prod, staging, dev, test) */
|
|
52
|
+
environment: R2Environment
|
|
53
|
+
/** Bucket type (iceberg, wal, snapshots) */
|
|
54
|
+
bucketType: R2BucketType
|
|
55
|
+
/** Optional custom bucket name prefix (default: 'postgres') */
|
|
56
|
+
bucketPrefix?: string
|
|
57
|
+
/** Optional region hint for cross-region replication */
|
|
58
|
+
region?: string
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Namespace configuration for multi-tenant isolation
|
|
63
|
+
*/
|
|
64
|
+
export interface NamespaceConfig {
|
|
65
|
+
/** Organization or tenant ID */
|
|
66
|
+
orgId?: string
|
|
67
|
+
/** Project ID within organization */
|
|
68
|
+
projectId?: string
|
|
69
|
+
/** Environment-specific prefix (e.g., 'prod', 'staging') */
|
|
70
|
+
envPrefix?: string
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Iceberg table location configuration
|
|
75
|
+
*/
|
|
76
|
+
export interface IcebergTableLocation {
|
|
77
|
+
/** Full namespace path */
|
|
78
|
+
namespace: string
|
|
79
|
+
/** Table name */
|
|
80
|
+
tableName: string
|
|
81
|
+
/** Full R2 path prefix for the table */
|
|
82
|
+
tablePrefix: string
|
|
83
|
+
/** Path to metadata directory */
|
|
84
|
+
metadataPath: string
|
|
85
|
+
/** Path to data directory */
|
|
86
|
+
dataPath: string
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Partition path components for data organization
|
|
91
|
+
*/
|
|
92
|
+
export interface PartitionComponents {
|
|
93
|
+
/** Durable Object ID */
|
|
94
|
+
doId: string
|
|
95
|
+
/** Timestamp in milliseconds */
|
|
96
|
+
timestamp: number
|
|
97
|
+
/** Partition granularity */
|
|
98
|
+
granularity: 'year' | 'month' | 'day' | 'hour'
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Lifecycle rule configuration for cost optimization
|
|
103
|
+
*/
|
|
104
|
+
export interface LifecycleRule {
|
|
105
|
+
/** Rule ID */
|
|
106
|
+
id: string
|
|
107
|
+
/** Path prefix this rule applies to */
|
|
108
|
+
prefix: string
|
|
109
|
+
/** Days after which to transition to Infrequent Access */
|
|
110
|
+
transitionToIADays?: number
|
|
111
|
+
/** Days after which to expire/delete objects */
|
|
112
|
+
expirationDays?: number
|
|
113
|
+
/** Whether rule is enabled */
|
|
114
|
+
enabled: boolean
|
|
115
|
+
/** Optional tags to match */
|
|
116
|
+
tags?: Record<string, string>
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Access control configuration for bucket/prefix level
|
|
121
|
+
*/
|
|
122
|
+
export interface AccessControlConfig {
|
|
123
|
+
/** Namespace this config applies to */
|
|
124
|
+
namespace: string
|
|
125
|
+
/** Read access allowed */
|
|
126
|
+
canRead: boolean
|
|
127
|
+
/** Write access allowed */
|
|
128
|
+
canWrite: boolean
|
|
129
|
+
/** Admin access (can modify table schema, delete) */
|
|
130
|
+
canAdmin: boolean
|
|
131
|
+
/** IP allowlist (CIDR notation) */
|
|
132
|
+
ipAllowlist?: string[]
|
|
133
|
+
/** Required auth token scopes */
|
|
134
|
+
requiredScopes?: string[]
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* R2 bucket naming convention
|
|
139
|
+
*/
|
|
140
|
+
const BUCKET_NAME_TEMPLATE = '{prefix}-{type}-{env}'
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Default bucket prefix
|
|
144
|
+
*/
|
|
145
|
+
const DEFAULT_BUCKET_PREFIX = 'postgres'
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Generate a bucket name following the naming convention
|
|
149
|
+
*
|
|
150
|
+
* Format: {prefix}-{type}-{env}
|
|
151
|
+
* Examples:
|
|
152
|
+
* - postgres-iceberg-prod
|
|
153
|
+
* - postgres-wal-staging
|
|
154
|
+
* - postgres-snapshots-dev
|
|
155
|
+
*
|
|
156
|
+
* @param config Bucket configuration
|
|
157
|
+
* @returns Formatted bucket name
|
|
158
|
+
*/
|
|
159
|
+
export function generateBucketName(config: R2BucketConfig): string {
|
|
160
|
+
const prefix = config.bucketPrefix ?? DEFAULT_BUCKET_PREFIX
|
|
161
|
+
return BUCKET_NAME_TEMPLATE
|
|
162
|
+
.replace('{prefix}', prefix)
|
|
163
|
+
.replace('{type}', config.bucketType)
|
|
164
|
+
.replace('{env}', config.environment)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Generate a namespace path for multi-tenant organization
|
|
169
|
+
*
|
|
170
|
+
* Format options:
|
|
171
|
+
* - org/{orgId}/project/{projectId} (full multi-tenant)
|
|
172
|
+
* - org/{orgId} (org-level only)
|
|
173
|
+
* - project/{projectId} (single-tenant with projects)
|
|
174
|
+
* - default (single-tenant)
|
|
175
|
+
*
|
|
176
|
+
* @param config Namespace configuration
|
|
177
|
+
* @returns Namespace path string
|
|
178
|
+
*/
|
|
179
|
+
export function generateNamespacePath(config: NamespaceConfig): string {
|
|
180
|
+
const parts: string[] = []
|
|
181
|
+
|
|
182
|
+
if (config.envPrefix) {
|
|
183
|
+
parts.push(config.envPrefix)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (config.orgId) {
|
|
187
|
+
parts.push('org', config.orgId)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (config.projectId) {
|
|
191
|
+
parts.push('project', config.projectId)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (parts.length === 0) {
|
|
195
|
+
return 'default'
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return parts.join('/')
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Generate the full table location in R2
|
|
203
|
+
*
|
|
204
|
+
* @param namespace Namespace path
|
|
205
|
+
* @param tableName Table name
|
|
206
|
+
* @returns IcebergTableLocation with all paths
|
|
207
|
+
*/
|
|
208
|
+
export function generateTableLocation(
|
|
209
|
+
namespace: string,
|
|
210
|
+
tableName: string
|
|
211
|
+
): IcebergTableLocation {
|
|
212
|
+
// Sanitize table name (lowercase, replace invalid chars)
|
|
213
|
+
const sanitizedTable = sanitizeTableName(tableName)
|
|
214
|
+
const tablePrefix = `${namespace}/${sanitizedTable}`
|
|
215
|
+
|
|
216
|
+
return {
|
|
217
|
+
namespace,
|
|
218
|
+
tableName: sanitizedTable,
|
|
219
|
+
tablePrefix,
|
|
220
|
+
metadataPath: `${tablePrefix}/metadata`,
|
|
221
|
+
dataPath: `${tablePrefix}/data`,
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Sanitize a table name for use in R2 paths
|
|
227
|
+
*
|
|
228
|
+
* - Converts to lowercase
|
|
229
|
+
* - Replaces spaces and invalid characters with underscores
|
|
230
|
+
* - Removes leading/trailing underscores
|
|
231
|
+
* - Limits length to 128 characters
|
|
232
|
+
*
|
|
233
|
+
* @param name Raw table name
|
|
234
|
+
* @returns Sanitized table name
|
|
235
|
+
*/
|
|
236
|
+
export function sanitizeTableName(name: string): string {
|
|
237
|
+
return name
|
|
238
|
+
.toLowerCase()
|
|
239
|
+
.replace(/[^a-z0-9_-]/g, '_')
|
|
240
|
+
.replace(/^[_-]+|[_-]+$/g, '')
|
|
241
|
+
.slice(0, 128)
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Generate a partition path for data files
|
|
246
|
+
*
|
|
247
|
+
* Format: do_id_partition={doId}/timestamp_{granularity}={value}
|
|
248
|
+
*
|
|
249
|
+
* Examples:
|
|
250
|
+
* - do_id_partition=abc123/timestamp_day=19789
|
|
251
|
+
* - do_id_partition=abc123/timestamp_hour=474936
|
|
252
|
+
*
|
|
253
|
+
* @param components Partition components
|
|
254
|
+
* @returns Partition path string
|
|
255
|
+
*/
|
|
256
|
+
export function generatePartitionDataPath(components: PartitionComponents): string {
|
|
257
|
+
const { doId, timestamp, granularity } = components
|
|
258
|
+
|
|
259
|
+
// Calculate partition value based on granularity
|
|
260
|
+
const partitionValue = calculatePartitionValue(timestamp, granularity)
|
|
261
|
+
|
|
262
|
+
return `do_id_partition=${encodePartitionValue(doId)}/timestamp_${granularity}=${partitionValue}`
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Calculate partition value for a timestamp at given granularity
|
|
267
|
+
*/
|
|
268
|
+
function calculatePartitionValue(
|
|
269
|
+
timestamp: number,
|
|
270
|
+
granularity: 'year' | 'month' | 'day' | 'hour'
|
|
271
|
+
): number {
|
|
272
|
+
switch (granularity) {
|
|
273
|
+
case 'year': {
|
|
274
|
+
const date = new Date(timestamp)
|
|
275
|
+
return date.getUTCFullYear()
|
|
276
|
+
}
|
|
277
|
+
case 'month': {
|
|
278
|
+
// Months since epoch (approximate)
|
|
279
|
+
return Math.floor(timestamp / (1000 * 60 * 60 * 24 * 30))
|
|
280
|
+
}
|
|
281
|
+
case 'day': {
|
|
282
|
+
// Days since epoch
|
|
283
|
+
return Math.floor(timestamp / (1000 * 60 * 60 * 24))
|
|
284
|
+
}
|
|
285
|
+
case 'hour': {
|
|
286
|
+
// Hours since epoch
|
|
287
|
+
return Math.floor(timestamp / (1000 * 60 * 60))
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Encode a partition value for use in paths
|
|
294
|
+
*/
|
|
295
|
+
function encodePartitionValue(value: unknown): string {
|
|
296
|
+
if (value === null || value === undefined) {
|
|
297
|
+
return '__HIVE_DEFAULT_PARTITION__'
|
|
298
|
+
}
|
|
299
|
+
return String(value).replace(/[/\\?%*:|"<>]/g, '_')
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Generate a data file path within the table
|
|
304
|
+
*
|
|
305
|
+
* Format: data/{partition_path}/data-{timestamp}-{uuid}.parquet
|
|
306
|
+
*
|
|
307
|
+
* @param tableLocation Table location configuration
|
|
308
|
+
* @param partitionPath Partition path (from generatePartitionDataPath)
|
|
309
|
+
* @param fileUuid Unique file identifier
|
|
310
|
+
* @returns Full data file path
|
|
311
|
+
*/
|
|
312
|
+
export function generateDataFilePath(
|
|
313
|
+
tableLocation: IcebergTableLocation,
|
|
314
|
+
partitionPath: string,
|
|
315
|
+
fileUuid: string
|
|
316
|
+
): string {
|
|
317
|
+
const timestamp = Date.now()
|
|
318
|
+
return `${tableLocation.dataPath}/${partitionPath}/data-${timestamp}-${fileUuid}.parquet`
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Generate a metadata file path
|
|
323
|
+
*
|
|
324
|
+
* @param tableLocation Table location configuration
|
|
325
|
+
* @param version Metadata version number
|
|
326
|
+
* @returns Full metadata file path
|
|
327
|
+
*/
|
|
328
|
+
export function generateMetadataFilePath(
|
|
329
|
+
tableLocation: IcebergTableLocation,
|
|
330
|
+
version: number
|
|
331
|
+
): string {
|
|
332
|
+
return `${tableLocation.metadataPath}/v${version}.metadata.json`
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Generate a manifest file path
|
|
337
|
+
*
|
|
338
|
+
* @param tableLocation Table location configuration
|
|
339
|
+
* @param snapshotId Snapshot ID
|
|
340
|
+
* @param attempt Manifest attempt number
|
|
341
|
+
* @param uuid Unique identifier
|
|
342
|
+
* @returns Full manifest file path
|
|
343
|
+
*/
|
|
344
|
+
export function generateManifestFilePath(
|
|
345
|
+
tableLocation: IcebergTableLocation,
|
|
346
|
+
snapshotId: number,
|
|
347
|
+
attempt: number,
|
|
348
|
+
uuid: string
|
|
349
|
+
): string {
|
|
350
|
+
return `${tableLocation.metadataPath}/${snapshotId}-m${attempt}-${uuid}.avro`
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Generate a manifest list file path
|
|
355
|
+
*
|
|
356
|
+
* @param tableLocation Table location configuration
|
|
357
|
+
* @param snapshotId Snapshot ID
|
|
358
|
+
* @param uuid Unique identifier
|
|
359
|
+
* @returns Full manifest list file path
|
|
360
|
+
*/
|
|
361
|
+
export function generateManifestListFilePath(
|
|
362
|
+
tableLocation: IcebergTableLocation,
|
|
363
|
+
snapshotId: number,
|
|
364
|
+
uuid: string
|
|
365
|
+
): string {
|
|
366
|
+
return `${tableLocation.metadataPath}/snap-${snapshotId}-${uuid}.avro`
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Parse a namespace path into its components
|
|
371
|
+
*
|
|
372
|
+
* @param namespacePath Full namespace path
|
|
373
|
+
* @returns Parsed namespace config or null if invalid
|
|
374
|
+
*/
|
|
375
|
+
export function parseNamespacePath(namespacePath: string): NamespaceConfig | null {
|
|
376
|
+
if (namespacePath === 'default') {
|
|
377
|
+
return {}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const parts = namespacePath.split('/')
|
|
381
|
+
const config: NamespaceConfig = {}
|
|
382
|
+
|
|
383
|
+
for (let i = 0; i < parts.length; i += 2) {
|
|
384
|
+
const type = parts[i]
|
|
385
|
+
const value = parts[i + 1]
|
|
386
|
+
|
|
387
|
+
if (!type || !value) continue
|
|
388
|
+
|
|
389
|
+
switch (type) {
|
|
390
|
+
case 'org':
|
|
391
|
+
config.orgId = value
|
|
392
|
+
break
|
|
393
|
+
case 'project':
|
|
394
|
+
config.projectId = value
|
|
395
|
+
break
|
|
396
|
+
default:
|
|
397
|
+
// Could be envPrefix if it's the first single part
|
|
398
|
+
if (i === 0 && parts.length % 2 === 1) {
|
|
399
|
+
config.envPrefix = type
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
return config
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Parse a table path into namespace and table name
|
|
409
|
+
*
|
|
410
|
+
* @param tablePath Full table path (e.g., "org/myorg/project/myproj/mytable")
|
|
411
|
+
* @returns Object with namespace and tableName, or null if invalid
|
|
412
|
+
*/
|
|
413
|
+
export function parseTablePath(
|
|
414
|
+
tablePath: string
|
|
415
|
+
): { namespace: string; tableName: string } | null {
|
|
416
|
+
const parts = tablePath.split('/')
|
|
417
|
+
if (parts.length === 0) {
|
|
418
|
+
return null
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
const tableName = parts.pop()
|
|
422
|
+
if (!tableName) {
|
|
423
|
+
return null
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
const namespace = parts.length > 0 ? parts.join('/') : 'default'
|
|
427
|
+
|
|
428
|
+
return { namespace, tableName }
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Default lifecycle rules for Iceberg storage optimization
|
|
433
|
+
*/
|
|
434
|
+
export function getDefaultLifecycleRules(namespace: string): LifecycleRule[] {
|
|
435
|
+
return [
|
|
436
|
+
{
|
|
437
|
+
id: `${namespace}-metadata-retention`,
|
|
438
|
+
prefix: `${namespace}/*/metadata/`,
|
|
439
|
+
// Keep metadata indefinitely (needed for time travel)
|
|
440
|
+
enabled: true,
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
id: `${namespace}-data-ia-transition`,
|
|
444
|
+
prefix: `${namespace}/*/data/`,
|
|
445
|
+
// Transition data files to Infrequent Access after 30 days
|
|
446
|
+
transitionToIADays: 30,
|
|
447
|
+
enabled: true,
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
id: `${namespace}-old-snapshots`,
|
|
451
|
+
prefix: `${namespace}/*/metadata/snap-`,
|
|
452
|
+
// Keep snapshots for 90 days by default
|
|
453
|
+
expirationDays: 90,
|
|
454
|
+
enabled: true,
|
|
455
|
+
},
|
|
456
|
+
]
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Generate access control configuration for a namespace
|
|
461
|
+
*
|
|
462
|
+
* @param namespace Namespace to configure
|
|
463
|
+
* @param permissions Permission settings
|
|
464
|
+
* @returns AccessControlConfig
|
|
465
|
+
*/
|
|
466
|
+
export function generateAccessControl(
|
|
467
|
+
namespace: string,
|
|
468
|
+
permissions: {
|
|
469
|
+
canRead?: boolean
|
|
470
|
+
canWrite?: boolean
|
|
471
|
+
canAdmin?: boolean
|
|
472
|
+
ipAllowlist?: string[]
|
|
473
|
+
requiredScopes?: string[]
|
|
474
|
+
} = {}
|
|
475
|
+
): AccessControlConfig {
|
|
476
|
+
const config: AccessControlConfig = {
|
|
477
|
+
namespace,
|
|
478
|
+
canRead: permissions.canRead ?? true,
|
|
479
|
+
canWrite: permissions.canWrite ?? false,
|
|
480
|
+
canAdmin: permissions.canAdmin ?? false,
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if (permissions.ipAllowlist) {
|
|
484
|
+
config.ipAllowlist = permissions.ipAllowlist
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
if (permissions.requiredScopes) {
|
|
488
|
+
config.requiredScopes = permissions.requiredScopes
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return config
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* R2 Organization Manager
|
|
496
|
+
*
|
|
497
|
+
* Manages R2 bucket organization for Iceberg tables including:
|
|
498
|
+
* - Table creation and location management
|
|
499
|
+
* - Namespace management for multi-tenancy
|
|
500
|
+
* - Lifecycle rule configuration
|
|
501
|
+
* - Access control
|
|
502
|
+
*
|
|
503
|
+
* @example
|
|
504
|
+
* ```typescript
|
|
505
|
+
* const manager = new R2OrganizationManager({
|
|
506
|
+
* bucket: env.ICEBERG_BUCKET,
|
|
507
|
+
* environment: 'prod',
|
|
508
|
+
* })
|
|
509
|
+
*
|
|
510
|
+
* // Create a namespaced table location
|
|
511
|
+
* const location = manager.createTableLocation({
|
|
512
|
+
* orgId: 'acme-corp',
|
|
513
|
+
* projectId: 'analytics',
|
|
514
|
+
* }, 'events')
|
|
515
|
+
*
|
|
516
|
+
* // Use with Iceberg writer
|
|
517
|
+
* const writer = createIcebergWALWriter({
|
|
518
|
+
* bucket: env.ICEBERG_BUCKET,
|
|
519
|
+
* tablePath: location.tablePrefix,
|
|
520
|
+
* })
|
|
521
|
+
* ```
|
|
522
|
+
*/
|
|
523
|
+
export class R2OrganizationManager {
|
|
524
|
+
private bucket: R2Bucket
|
|
525
|
+
private environment: R2Environment
|
|
526
|
+
private bucketPrefix: string
|
|
527
|
+
|
|
528
|
+
constructor(config: {
|
|
529
|
+
bucket: R2Bucket
|
|
530
|
+
environment: R2Environment
|
|
531
|
+
bucketPrefix?: string
|
|
532
|
+
}) {
|
|
533
|
+
this.bucket = config.bucket
|
|
534
|
+
this.environment = config.environment
|
|
535
|
+
this.bucketPrefix = config.bucketPrefix ?? DEFAULT_BUCKET_PREFIX
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Get the expected bucket name for this environment
|
|
540
|
+
*/
|
|
541
|
+
getExpectedBucketName(): string {
|
|
542
|
+
return generateBucketName({
|
|
543
|
+
environment: this.environment,
|
|
544
|
+
bucketType: 'iceberg',
|
|
545
|
+
bucketPrefix: this.bucketPrefix,
|
|
546
|
+
})
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* Create a table location within a namespace
|
|
551
|
+
*/
|
|
552
|
+
createTableLocation(
|
|
553
|
+
namespaceConfig: NamespaceConfig,
|
|
554
|
+
tableName: string
|
|
555
|
+
): IcebergTableLocation {
|
|
556
|
+
const namespace = generateNamespacePath(namespaceConfig)
|
|
557
|
+
return generateTableLocation(namespace, tableName)
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* Build R2 list options, only including defined properties
|
|
562
|
+
*/
|
|
563
|
+
private buildListOptions(
|
|
564
|
+
prefix: string | undefined,
|
|
565
|
+
delimiter: string | undefined,
|
|
566
|
+
cursor: string | undefined
|
|
567
|
+
): R2ListOptions {
|
|
568
|
+
const listOptions: R2ListOptions = {}
|
|
569
|
+
if (prefix !== undefined) {
|
|
570
|
+
listOptions.prefix = prefix
|
|
571
|
+
}
|
|
572
|
+
if (delimiter !== undefined) {
|
|
573
|
+
listOptions.delimiter = delimiter
|
|
574
|
+
}
|
|
575
|
+
if (cursor !== undefined) {
|
|
576
|
+
listOptions.cursor = cursor
|
|
577
|
+
}
|
|
578
|
+
return listOptions
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* List all namespaces in the bucket
|
|
583
|
+
*/
|
|
584
|
+
async listNamespaces(): Promise<string[]> {
|
|
585
|
+
const namespaces: Set<string> = new Set()
|
|
586
|
+
|
|
587
|
+
let cursor: string | undefined
|
|
588
|
+
do {
|
|
589
|
+
const result = await this.bucket.list(
|
|
590
|
+
this.buildListOptions(undefined, '/', cursor)
|
|
591
|
+
)
|
|
592
|
+
|
|
593
|
+
for (const prefix of result.delimitedPrefixes ?? []) {
|
|
594
|
+
// Extract namespace from prefix
|
|
595
|
+
const namespace = prefix.replace(/\/$/, '')
|
|
596
|
+
if (namespace) {
|
|
597
|
+
namespaces.add(namespace)
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
cursor = result.truncated ? result.cursor : undefined
|
|
602
|
+
} while (cursor)
|
|
603
|
+
|
|
604
|
+
return Array.from(namespaces)
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* List all tables in a namespace
|
|
609
|
+
*/
|
|
610
|
+
async listTables(namespace: string): Promise<string[]> {
|
|
611
|
+
const tables: Set<string> = new Set()
|
|
612
|
+
const prefix = `${namespace}/`
|
|
613
|
+
|
|
614
|
+
let cursor: string | undefined
|
|
615
|
+
do {
|
|
616
|
+
const result = await this.bucket.list(
|
|
617
|
+
this.buildListOptions(prefix, '/', cursor)
|
|
618
|
+
)
|
|
619
|
+
|
|
620
|
+
for (const tablePrefix of result.delimitedPrefixes ?? []) {
|
|
621
|
+
// Extract table name from prefix
|
|
622
|
+
const tablePath = tablePrefix.slice(prefix.length).replace(/\/$/, '')
|
|
623
|
+
if (tablePath && !tablePath.includes('/')) {
|
|
624
|
+
tables.add(tablePath)
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
cursor = result.truncated ? result.cursor : undefined
|
|
629
|
+
} while (cursor)
|
|
630
|
+
|
|
631
|
+
return Array.from(tables)
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Check if a table exists
|
|
636
|
+
*/
|
|
637
|
+
async tableExists(location: IcebergTableLocation): Promise<boolean> {
|
|
638
|
+
const versionHint = await this.bucket.head(
|
|
639
|
+
`${location.metadataPath}/version-hint.text`
|
|
640
|
+
)
|
|
641
|
+
return versionHint !== null
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Get the current metadata version for a table
|
|
646
|
+
*/
|
|
647
|
+
async getCurrentMetadataVersion(location: IcebergTableLocation): Promise<number | null> {
|
|
648
|
+
const versionHint = await this.bucket.get(
|
|
649
|
+
`${location.metadataPath}/version-hint.text`
|
|
650
|
+
)
|
|
651
|
+
if (!versionHint) {
|
|
652
|
+
return null
|
|
653
|
+
}
|
|
654
|
+
const versionText = await versionHint.text()
|
|
655
|
+
return parseInt(versionText, 10)
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* List all metadata versions for a table
|
|
660
|
+
*/
|
|
661
|
+
async listMetadataVersions(location: IcebergTableLocation): Promise<number[]> {
|
|
662
|
+
const versions: number[] = []
|
|
663
|
+
const prefix = `${location.metadataPath}/v`
|
|
664
|
+
|
|
665
|
+
let cursor: string | undefined
|
|
666
|
+
do {
|
|
667
|
+
const result = await this.bucket.list(
|
|
668
|
+
this.buildListOptions(prefix, undefined, cursor)
|
|
669
|
+
)
|
|
670
|
+
|
|
671
|
+
for (const obj of result.objects) {
|
|
672
|
+
const match = obj.key.match(/v(\d+)\.metadata\.json$/)
|
|
673
|
+
if (match && match[1]) {
|
|
674
|
+
versions.push(parseInt(match[1], 10))
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
cursor = result.truncated ? result.cursor : undefined
|
|
679
|
+
} while (cursor)
|
|
680
|
+
|
|
681
|
+
return versions.sort((a, b) => a - b)
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
/**
|
|
685
|
+
* List all snapshots for a table
|
|
686
|
+
*/
|
|
687
|
+
async listSnapshots(
|
|
688
|
+
location: IcebergTableLocation
|
|
689
|
+
): Promise<Array<{ snapshotId: number; key: string }>> {
|
|
690
|
+
const snapshots: Array<{ snapshotId: number; key: string }> = []
|
|
691
|
+
const prefix = `${location.metadataPath}/snap-`
|
|
692
|
+
|
|
693
|
+
let cursor: string | undefined
|
|
694
|
+
do {
|
|
695
|
+
const result = await this.bucket.list(
|
|
696
|
+
this.buildListOptions(prefix, undefined, cursor)
|
|
697
|
+
)
|
|
698
|
+
|
|
699
|
+
for (const obj of result.objects) {
|
|
700
|
+
const match = obj.key.match(/snap-(\d+)-/)
|
|
701
|
+
if (match && match[1]) {
|
|
702
|
+
snapshots.push({
|
|
703
|
+
snapshotId: parseInt(match[1], 10),
|
|
704
|
+
key: obj.key,
|
|
705
|
+
})
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
cursor = result.truncated ? result.cursor : undefined
|
|
710
|
+
} while (cursor)
|
|
711
|
+
|
|
712
|
+
return snapshots.sort((a, b) => a.snapshotId - b.snapshotId)
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/**
|
|
716
|
+
* List data files for a specific partition
|
|
717
|
+
*/
|
|
718
|
+
async listPartitionDataFiles(
|
|
719
|
+
location: IcebergTableLocation,
|
|
720
|
+
partitionPath: string
|
|
721
|
+
): Promise<string[]> {
|
|
722
|
+
const files: string[] = []
|
|
723
|
+
const prefix = `${location.dataPath}/${partitionPath}/`
|
|
724
|
+
|
|
725
|
+
let cursor: string | undefined
|
|
726
|
+
do {
|
|
727
|
+
const result = await this.bucket.list(
|
|
728
|
+
this.buildListOptions(prefix, undefined, cursor)
|
|
729
|
+
)
|
|
730
|
+
|
|
731
|
+
for (const obj of result.objects) {
|
|
732
|
+
if (obj.key.endsWith('.parquet')) {
|
|
733
|
+
files.push(obj.key)
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
cursor = result.truncated ? result.cursor : undefined
|
|
738
|
+
} while (cursor)
|
|
739
|
+
|
|
740
|
+
return files
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* Get total storage size for a table
|
|
745
|
+
*/
|
|
746
|
+
async getTableSize(location: IcebergTableLocation): Promise<{
|
|
747
|
+
metadataBytes: number
|
|
748
|
+
dataBytes: number
|
|
749
|
+
totalBytes: number
|
|
750
|
+
fileCount: number
|
|
751
|
+
}> {
|
|
752
|
+
let metadataBytes = 0
|
|
753
|
+
let dataBytes = 0
|
|
754
|
+
let fileCount = 0
|
|
755
|
+
|
|
756
|
+
// Count metadata files
|
|
757
|
+
let cursor: string | undefined
|
|
758
|
+
do {
|
|
759
|
+
const result = await this.bucket.list(
|
|
760
|
+
this.buildListOptions(`${location.metadataPath}/`, undefined, cursor)
|
|
761
|
+
)
|
|
762
|
+
|
|
763
|
+
for (const obj of result.objects) {
|
|
764
|
+
metadataBytes += obj.size
|
|
765
|
+
fileCount++
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
cursor = result.truncated ? result.cursor : undefined
|
|
769
|
+
} while (cursor)
|
|
770
|
+
|
|
771
|
+
// Count data files
|
|
772
|
+
cursor = undefined
|
|
773
|
+
do {
|
|
774
|
+
const result = await this.bucket.list(
|
|
775
|
+
this.buildListOptions(`${location.dataPath}/`, undefined, cursor)
|
|
776
|
+
)
|
|
777
|
+
|
|
778
|
+
for (const obj of result.objects) {
|
|
779
|
+
dataBytes += obj.size
|
|
780
|
+
fileCount++
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
cursor = result.truncated ? result.cursor : undefined
|
|
784
|
+
} while (cursor)
|
|
785
|
+
|
|
786
|
+
return {
|
|
787
|
+
metadataBytes,
|
|
788
|
+
dataBytes,
|
|
789
|
+
totalBytes: metadataBytes + dataBytes,
|
|
790
|
+
fileCount,
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/**
|
|
795
|
+
* Delete a table and all its data
|
|
796
|
+
*
|
|
797
|
+
* WARNING: This is a destructive operation that cannot be undone.
|
|
798
|
+
*/
|
|
799
|
+
async deleteTable(location: IcebergTableLocation): Promise<number> {
|
|
800
|
+
const keysToDelete: string[] = []
|
|
801
|
+
|
|
802
|
+
// Collect all keys for the table
|
|
803
|
+
let cursor: string | undefined
|
|
804
|
+
do {
|
|
805
|
+
const result = await this.bucket.list(
|
|
806
|
+
this.buildListOptions(`${location.tablePrefix}/`, undefined, cursor)
|
|
807
|
+
)
|
|
808
|
+
|
|
809
|
+
for (const obj of result.objects) {
|
|
810
|
+
keysToDelete.push(obj.key)
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
cursor = result.truncated ? result.cursor : undefined
|
|
814
|
+
} while (cursor)
|
|
815
|
+
|
|
816
|
+
// Delete in batches
|
|
817
|
+
const batchSize = 100
|
|
818
|
+
for (let i = 0; i < keysToDelete.length; i += batchSize) {
|
|
819
|
+
const batch = keysToDelete.slice(i, i + batchSize)
|
|
820
|
+
await this.bucket.delete(batch)
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
return keysToDelete.length
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* Get the bucket reference
|
|
828
|
+
*/
|
|
829
|
+
getBucket(): R2Bucket {
|
|
830
|
+
return this.bucket
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
/**
|
|
834
|
+
* Get the environment
|
|
835
|
+
*/
|
|
836
|
+
getEnvironment(): R2Environment {
|
|
837
|
+
return this.environment
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
/**
|
|
842
|
+
* Create an R2 Organization Manager
|
|
843
|
+
*
|
|
844
|
+
* @example
|
|
845
|
+
* ```typescript
|
|
846
|
+
* const manager = createR2OrganizationManager({
|
|
847
|
+
* bucket: env.ICEBERG_BUCKET,
|
|
848
|
+
* environment: 'prod',
|
|
849
|
+
* })
|
|
850
|
+
*
|
|
851
|
+
* const location = manager.createTableLocation(
|
|
852
|
+
* { orgId: 'my-org', projectId: 'my-project' },
|
|
853
|
+
* 'events'
|
|
854
|
+
* )
|
|
855
|
+
* ```
|
|
856
|
+
*/
|
|
857
|
+
export function createR2OrganizationManager(config: {
|
|
858
|
+
bucket: R2Bucket
|
|
859
|
+
environment: R2Environment
|
|
860
|
+
bucketPrefix?: string
|
|
861
|
+
}): R2OrganizationManager {
|
|
862
|
+
return new R2OrganizationManager(config)
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
/**
|
|
866
|
+
* Multi-tenant table registry for managing tables across namespaces
|
|
867
|
+
*/
|
|
868
|
+
export class MultiTenantTableRegistry {
|
|
869
|
+
private manager: R2OrganizationManager
|
|
870
|
+
private tableCache: Map<string, IcebergTableLocation> = new Map()
|
|
871
|
+
|
|
872
|
+
constructor(manager: R2OrganizationManager) {
|
|
873
|
+
this.manager = manager
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
/**
|
|
877
|
+
* Register a table in the registry
|
|
878
|
+
*/
|
|
879
|
+
registerTable(
|
|
880
|
+
namespaceConfig: NamespaceConfig,
|
|
881
|
+
tableName: string
|
|
882
|
+
): IcebergTableLocation {
|
|
883
|
+
const location = this.manager.createTableLocation(namespaceConfig, tableName)
|
|
884
|
+
const key = `${location.namespace}/${location.tableName}`
|
|
885
|
+
this.tableCache.set(key, location)
|
|
886
|
+
return location
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
/**
|
|
890
|
+
* Get a table location from the registry
|
|
891
|
+
*/
|
|
892
|
+
getTable(namespace: string, tableName: string): IcebergTableLocation | null {
|
|
893
|
+
const key = `${namespace}/${tableName}`
|
|
894
|
+
return this.tableCache.get(key) ?? null
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
/**
|
|
898
|
+
* Get or create a table location
|
|
899
|
+
*/
|
|
900
|
+
getOrCreate(
|
|
901
|
+
namespaceConfig: NamespaceConfig,
|
|
902
|
+
tableName: string
|
|
903
|
+
): IcebergTableLocation {
|
|
904
|
+
const namespace = generateNamespacePath(namespaceConfig)
|
|
905
|
+
const existing = this.getTable(namespace, tableName)
|
|
906
|
+
if (existing) {
|
|
907
|
+
return existing
|
|
908
|
+
}
|
|
909
|
+
return this.registerTable(namespaceConfig, tableName)
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
/**
|
|
913
|
+
* List all registered tables
|
|
914
|
+
*/
|
|
915
|
+
listRegisteredTables(): IcebergTableLocation[] {
|
|
916
|
+
return Array.from(this.tableCache.values())
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
/**
|
|
920
|
+
* Clear the table cache
|
|
921
|
+
*/
|
|
922
|
+
clearCache(): void {
|
|
923
|
+
this.tableCache.clear()
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/**
|
|
927
|
+
* Refresh the cache from R2
|
|
928
|
+
*/
|
|
929
|
+
async refreshFromR2(): Promise<void> {
|
|
930
|
+
this.tableCache.clear()
|
|
931
|
+
|
|
932
|
+
const namespaces = await this.manager.listNamespaces()
|
|
933
|
+
for (const namespace of namespaces) {
|
|
934
|
+
const tables = await this.manager.listTables(namespace)
|
|
935
|
+
for (const tableName of tables) {
|
|
936
|
+
const location = generateTableLocation(namespace, tableName)
|
|
937
|
+
const key = `${namespace}/${tableName}`
|
|
938
|
+
this.tableCache.set(key, location)
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
/**
|
|
945
|
+
* Create a multi-tenant table registry
|
|
946
|
+
*/
|
|
947
|
+
export function createMultiTenantTableRegistry(
|
|
948
|
+
manager: R2OrganizationManager
|
|
949
|
+
): MultiTenantTableRegistry {
|
|
950
|
+
return new MultiTenantTableRegistry(manager)
|
|
951
|
+
}
|