@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,1052 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time Travel Query API
|
|
3
|
+
* Task: postgres-3kc - Time travel query API (query as-of timestamp)
|
|
4
|
+
*
|
|
5
|
+
* Enables querying data as of a specific timestamp using Iceberg snapshots.
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Point-in-time queries (exact snapshot at timestamp)
|
|
8
|
+
* - Relative timestamps (e.g., '1 hour ago')
|
|
9
|
+
* - SQL AS OF syntax parsing
|
|
10
|
+
* - Query routing to appropriate storage
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type {
|
|
14
|
+
IcebergTableMetadata,
|
|
15
|
+
IcebergSnapshot,
|
|
16
|
+
IcebergManifestFile,
|
|
17
|
+
IcebergManifestEntry,
|
|
18
|
+
IcebergDataFile,
|
|
19
|
+
} from './types'
|
|
20
|
+
|
|
21
|
+
// Re-export Iceberg types for consumers
|
|
22
|
+
export type { IcebergTableMetadata, IcebergSnapshot, IcebergDataFile }
|
|
23
|
+
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Types
|
|
26
|
+
// ============================================================================
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Time travel query mode
|
|
30
|
+
*/
|
|
31
|
+
export type TimeTravelMode = 'point-in-time' | 'range' | 'versions-between' | 'latest'
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Timestamp specification for time travel queries
|
|
35
|
+
* Can be an ISO string, epoch milliseconds, or relative expression
|
|
36
|
+
*/
|
|
37
|
+
export type TimestampSpec = string | number | Date
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Parsed timestamp result
|
|
41
|
+
*/
|
|
42
|
+
export interface ParsedTimestamp {
|
|
43
|
+
/** Resolved timestamp in milliseconds since epoch */
|
|
44
|
+
timestampMs: number
|
|
45
|
+
/** Original input for reference */
|
|
46
|
+
original: TimestampSpec
|
|
47
|
+
/** Whether this was a relative timestamp */
|
|
48
|
+
isRelative: boolean
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Time travel query options
|
|
53
|
+
*/
|
|
54
|
+
export interface TimeTravelQueryOptions {
|
|
55
|
+
/** Target timestamp for the query */
|
|
56
|
+
asOf?: TimestampSpec
|
|
57
|
+
/** Start timestamp for range queries */
|
|
58
|
+
fromTimestamp?: TimestampSpec
|
|
59
|
+
/** End timestamp for range queries */
|
|
60
|
+
toTimestamp?: TimestampSpec
|
|
61
|
+
/** Query mode (default: 'point-in-time' if asOf is provided, 'latest' otherwise) */
|
|
62
|
+
mode?: TimeTravelMode
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Resolved snapshot for time travel query
|
|
67
|
+
*/
|
|
68
|
+
export interface ResolvedSnapshot {
|
|
69
|
+
/** The snapshot to query */
|
|
70
|
+
snapshot: IcebergSnapshot
|
|
71
|
+
/** Resolved timestamp in milliseconds */
|
|
72
|
+
timestampMs: number
|
|
73
|
+
/** Whether exact match was found or nearest was used */
|
|
74
|
+
exactMatch: boolean
|
|
75
|
+
/** Time difference from requested timestamp (ms) */
|
|
76
|
+
timeDifferenceMs: number
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Time travel query result metadata
|
|
81
|
+
*/
|
|
82
|
+
export interface TimeTravelMetadata {
|
|
83
|
+
/** Resolved snapshot ID */
|
|
84
|
+
snapshotId: number
|
|
85
|
+
/** Snapshot timestamp */
|
|
86
|
+
snapshotTimestampMs: number
|
|
87
|
+
/** Requested timestamp */
|
|
88
|
+
requestedTimestampMs: number
|
|
89
|
+
/** Query mode used */
|
|
90
|
+
mode: TimeTravelMode
|
|
91
|
+
/** Number of data files scanned */
|
|
92
|
+
dataFilesScanned: number
|
|
93
|
+
/** Total records in snapshot */
|
|
94
|
+
totalRecords: number
|
|
95
|
+
/** For versions-between mode: number of snapshots included */
|
|
96
|
+
snapshotCount?: number
|
|
97
|
+
/** For versions-between mode: start timestamp */
|
|
98
|
+
startTimestampMs?: number
|
|
99
|
+
/** For versions-between mode: end timestamp */
|
|
100
|
+
endTimestampMs?: number
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Data files resolved for a time travel query
|
|
105
|
+
*/
|
|
106
|
+
export interface ResolvedDataFiles {
|
|
107
|
+
/** List of data files to read */
|
|
108
|
+
dataFiles: IcebergDataFile[]
|
|
109
|
+
/** Metadata about the resolution */
|
|
110
|
+
metadata: TimeTravelMetadata
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Operation type for row versions
|
|
115
|
+
*/
|
|
116
|
+
export type RowOperation = 'INSERT' | 'UPDATE' | 'DELETE'
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* System columns for version tracking
|
|
120
|
+
*/
|
|
121
|
+
export interface VersionSystemColumns {
|
|
122
|
+
/** Operation that created this version */
|
|
123
|
+
_operation: RowOperation
|
|
124
|
+
/** Timestamp when this version became current */
|
|
125
|
+
_valid_from: number
|
|
126
|
+
/** Timestamp when this version was superseded (null if current) */
|
|
127
|
+
_valid_to: number | null
|
|
128
|
+
/** Transaction ID that created this version */
|
|
129
|
+
_transaction_id: number
|
|
130
|
+
/** Snapshot ID where this version exists */
|
|
131
|
+
_snapshot_id: number
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Row version with data and system columns
|
|
136
|
+
*/
|
|
137
|
+
export interface RowVersion<T = Record<string, unknown>> {
|
|
138
|
+
/** User data columns */
|
|
139
|
+
data: T
|
|
140
|
+
/** System version tracking columns */
|
|
141
|
+
system: VersionSystemColumns
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Result of a VERSIONS BETWEEN query
|
|
146
|
+
*/
|
|
147
|
+
export interface VersionsBetweenResult<T = Record<string, unknown>> {
|
|
148
|
+
/** All versions of rows in the time range */
|
|
149
|
+
versions: RowVersion<T>[]
|
|
150
|
+
/** Metadata about the query */
|
|
151
|
+
metadata: TimeTravelMetadata
|
|
152
|
+
/** Whether there are more versions (for pagination) */
|
|
153
|
+
hasMore: boolean
|
|
154
|
+
/** Continuation token for pagination */
|
|
155
|
+
continuationToken?: string
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Configuration for the time travel reader
|
|
160
|
+
*/
|
|
161
|
+
export interface TimeTravelReaderConfig {
|
|
162
|
+
/** R2 bucket for reading Iceberg data */
|
|
163
|
+
bucket: R2Bucket
|
|
164
|
+
/** Default retention window in milliseconds (default: 30 days) */
|
|
165
|
+
retentionWindowMs?: number
|
|
166
|
+
/** Maximum allowed query age in milliseconds (default: 90 days) */
|
|
167
|
+
maxQueryAgeMs?: number
|
|
168
|
+
/** Enable caching of manifest data (default: true) */
|
|
169
|
+
enableManifestCache?: boolean
|
|
170
|
+
/** Cache TTL in milliseconds (default: 5 minutes) */
|
|
171
|
+
manifestCacheTtlMs?: number
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Error thrown when timestamp is out of retention range
|
|
176
|
+
*/
|
|
177
|
+
export class TimestampOutOfRangeError extends Error {
|
|
178
|
+
constructor(
|
|
179
|
+
public readonly requestedTimestamp: number,
|
|
180
|
+
public readonly oldestAvailable: number,
|
|
181
|
+
public readonly newestAvailable: number
|
|
182
|
+
) {
|
|
183
|
+
const requested = new Date(requestedTimestamp).toISOString()
|
|
184
|
+
const oldest = new Date(oldestAvailable).toISOString()
|
|
185
|
+
const newest = new Date(newestAvailable).toISOString()
|
|
186
|
+
super(
|
|
187
|
+
`Requested timestamp ${requested} is out of range. ` +
|
|
188
|
+
`Available range: ${oldest} to ${newest}`
|
|
189
|
+
)
|
|
190
|
+
this.name = 'TimestampOutOfRangeError'
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Error thrown when no snapshot is found
|
|
196
|
+
*/
|
|
197
|
+
export class NoSnapshotFoundError extends Error {
|
|
198
|
+
constructor(public readonly requestedTimestamp: number) {
|
|
199
|
+
super(
|
|
200
|
+
`No snapshot found for timestamp ${new Date(requestedTimestamp).toISOString()}. ` +
|
|
201
|
+
`The table may not have any data yet.`
|
|
202
|
+
)
|
|
203
|
+
this.name = 'NoSnapshotFoundError'
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Error thrown for invalid timestamp format
|
|
209
|
+
*/
|
|
210
|
+
export class InvalidTimestampError extends Error {
|
|
211
|
+
constructor(public readonly input: unknown) {
|
|
212
|
+
super(`Invalid timestamp format: ${String(input)}`)
|
|
213
|
+
this.name = 'InvalidTimestampError'
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// ============================================================================
|
|
218
|
+
// Timestamp Parsing
|
|
219
|
+
// ============================================================================
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Relative time patterns and their millisecond multipliers
|
|
223
|
+
*/
|
|
224
|
+
const RELATIVE_TIME_PATTERNS: Array<{
|
|
225
|
+
pattern: RegExp
|
|
226
|
+
multiplier: number
|
|
227
|
+
}> = [
|
|
228
|
+
{ pattern: /^(\d+)\s*(ms|milliseconds?)\s*ago$/i, multiplier: 1 },
|
|
229
|
+
{ pattern: /^(\d+)\s*(s|sec|seconds?)\s*ago$/i, multiplier: 1000 },
|
|
230
|
+
{ pattern: /^(\d+)\s*(m|min|minutes?)\s*ago$/i, multiplier: 60 * 1000 },
|
|
231
|
+
{ pattern: /^(\d+)\s*(h|hr|hours?)\s*ago$/i, multiplier: 60 * 60 * 1000 },
|
|
232
|
+
{ pattern: /^(\d+)\s*(d|days?)\s*ago$/i, multiplier: 24 * 60 * 60 * 1000 },
|
|
233
|
+
{ pattern: /^(\d+)\s*(w|wk|weeks?)\s*ago$/i, multiplier: 7 * 24 * 60 * 60 * 1000 },
|
|
234
|
+
{ pattern: /^(\d+)\s*(mo|months?)\s*ago$/i, multiplier: 30 * 24 * 60 * 60 * 1000 },
|
|
235
|
+
{ pattern: /^(\d+)\s*(y|yr|years?)\s*ago$/i, multiplier: 365 * 24 * 60 * 60 * 1000 },
|
|
236
|
+
]
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* SQL INTERVAL patterns for PostgreSQL-style interval syntax
|
|
240
|
+
* Matches: INTERVAL '1 hour', INTERVAL '30 minutes', etc.
|
|
241
|
+
*/
|
|
242
|
+
const SQL_INTERVAL_PATTERNS: Array<{
|
|
243
|
+
pattern: RegExp
|
|
244
|
+
multiplier: number
|
|
245
|
+
}> = [
|
|
246
|
+
{ pattern: /^interval\s*'(\d+)\s*(ms|milliseconds?)'$/i, multiplier: 1 },
|
|
247
|
+
{ pattern: /^interval\s*'(\d+)\s*(s|sec|seconds?)'$/i, multiplier: 1000 },
|
|
248
|
+
{ pattern: /^interval\s*'(\d+)\s*(m|min|minutes?)'$/i, multiplier: 60 * 1000 },
|
|
249
|
+
{ pattern: /^interval\s*'(\d+)\s*(h|hr|hours?)'$/i, multiplier: 60 * 60 * 1000 },
|
|
250
|
+
{ pattern: /^interval\s*'(\d+)\s*(d|days?)'$/i, multiplier: 24 * 60 * 60 * 1000 },
|
|
251
|
+
{ pattern: /^interval\s*'(\d+)\s*(w|wk|weeks?)'$/i, multiplier: 7 * 24 * 60 * 60 * 1000 },
|
|
252
|
+
{ pattern: /^interval\s*'(\d+)\s*(mo|months?)'$/i, multiplier: 30 * 24 * 60 * 60 * 1000 },
|
|
253
|
+
{ pattern: /^interval\s*'(\d+)\s*(y|yr|years?)'$/i, multiplier: 365 * 24 * 60 * 60 * 1000 },
|
|
254
|
+
]
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Parse a timestamp specification into milliseconds since epoch
|
|
258
|
+
*/
|
|
259
|
+
export function parseTimestamp(spec: TimestampSpec, referenceTime?: number): ParsedTimestamp {
|
|
260
|
+
const now = referenceTime ?? Date.now()
|
|
261
|
+
|
|
262
|
+
// Already a number (epoch ms)
|
|
263
|
+
if (typeof spec === 'number') {
|
|
264
|
+
return {
|
|
265
|
+
timestampMs: spec,
|
|
266
|
+
original: spec,
|
|
267
|
+
isRelative: false,
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Date object
|
|
272
|
+
if (spec instanceof Date) {
|
|
273
|
+
return {
|
|
274
|
+
timestampMs: spec.getTime(),
|
|
275
|
+
original: spec,
|
|
276
|
+
isRelative: false,
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// String - try various formats
|
|
281
|
+
if (typeof spec === 'string') {
|
|
282
|
+
const trimmed = spec.trim()
|
|
283
|
+
|
|
284
|
+
// Check for NOW() or CURRENT_TIMESTAMP (case insensitive)
|
|
285
|
+
if (/^(now\(\)|current_timestamp)$/i.test(trimmed)) {
|
|
286
|
+
return {
|
|
287
|
+
timestampMs: now,
|
|
288
|
+
original: spec,
|
|
289
|
+
isRelative: true,
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Check for NOW() - INTERVAL or CURRENT_TIMESTAMP - INTERVAL patterns
|
|
294
|
+
const nowMinusIntervalMatch = trimmed.match(
|
|
295
|
+
/^(now\(\)|current_timestamp)\s*-\s*interval\s*'(\d+)\s*(\w+)'$/i
|
|
296
|
+
)
|
|
297
|
+
if (nowMinusIntervalMatch) {
|
|
298
|
+
const value = parseInt(nowMinusIntervalMatch[2]!, 10)
|
|
299
|
+
const unit = nowMinusIntervalMatch[3]!.toLowerCase()
|
|
300
|
+
const multiplier = getIntervalMultiplier(unit)
|
|
301
|
+
if (multiplier !== null) {
|
|
302
|
+
return {
|
|
303
|
+
timestampMs: now - value * multiplier,
|
|
304
|
+
original: spec,
|
|
305
|
+
isRelative: true,
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Check for relative time expressions (e.g., "1 hour ago")
|
|
311
|
+
for (const { pattern, multiplier } of RELATIVE_TIME_PATTERNS) {
|
|
312
|
+
const match = trimmed.match(pattern)
|
|
313
|
+
if (match && match[1]) {
|
|
314
|
+
const value = parseInt(match[1], 10)
|
|
315
|
+
return {
|
|
316
|
+
timestampMs: now - value * multiplier,
|
|
317
|
+
original: spec,
|
|
318
|
+
isRelative: true,
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Check for SQL INTERVAL syntax (standalone, treated as relative to now)
|
|
324
|
+
for (const { pattern, multiplier } of SQL_INTERVAL_PATTERNS) {
|
|
325
|
+
const match = trimmed.match(pattern)
|
|
326
|
+
if (match && match[1]) {
|
|
327
|
+
const value = parseInt(match[1], 10)
|
|
328
|
+
return {
|
|
329
|
+
timestampMs: now - value * multiplier,
|
|
330
|
+
original: spec,
|
|
331
|
+
isRelative: true,
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Try ISO date parsing
|
|
337
|
+
const parsed = Date.parse(trimmed)
|
|
338
|
+
if (!isNaN(parsed)) {
|
|
339
|
+
return {
|
|
340
|
+
timestampMs: parsed,
|
|
341
|
+
original: spec,
|
|
342
|
+
isRelative: false,
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Try numeric string (epoch ms)
|
|
347
|
+
const numeric = parseInt(trimmed, 10)
|
|
348
|
+
if (!isNaN(numeric) && String(numeric) === trimmed) {
|
|
349
|
+
return {
|
|
350
|
+
timestampMs: numeric,
|
|
351
|
+
original: spec,
|
|
352
|
+
isRelative: false,
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
throw new InvalidTimestampError(spec)
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Get the millisecond multiplier for an interval unit
|
|
362
|
+
*/
|
|
363
|
+
function getIntervalMultiplier(unit: string): number | null {
|
|
364
|
+
const unitLower = unit.toLowerCase()
|
|
365
|
+
const unitMap: Record<string, number> = {
|
|
366
|
+
ms: 1,
|
|
367
|
+
millisecond: 1,
|
|
368
|
+
milliseconds: 1,
|
|
369
|
+
s: 1000,
|
|
370
|
+
sec: 1000,
|
|
371
|
+
second: 1000,
|
|
372
|
+
seconds: 1000,
|
|
373
|
+
m: 60 * 1000,
|
|
374
|
+
min: 60 * 1000,
|
|
375
|
+
minute: 60 * 1000,
|
|
376
|
+
minutes: 60 * 1000,
|
|
377
|
+
h: 60 * 60 * 1000,
|
|
378
|
+
hr: 60 * 60 * 1000,
|
|
379
|
+
hour: 60 * 60 * 1000,
|
|
380
|
+
hours: 60 * 60 * 1000,
|
|
381
|
+
d: 24 * 60 * 60 * 1000,
|
|
382
|
+
day: 24 * 60 * 60 * 1000,
|
|
383
|
+
days: 24 * 60 * 60 * 1000,
|
|
384
|
+
w: 7 * 24 * 60 * 60 * 1000,
|
|
385
|
+
wk: 7 * 24 * 60 * 60 * 1000,
|
|
386
|
+
week: 7 * 24 * 60 * 60 * 1000,
|
|
387
|
+
weeks: 7 * 24 * 60 * 60 * 1000,
|
|
388
|
+
mo: 30 * 24 * 60 * 60 * 1000,
|
|
389
|
+
month: 30 * 24 * 60 * 60 * 1000,
|
|
390
|
+
months: 30 * 24 * 60 * 60 * 1000,
|
|
391
|
+
y: 365 * 24 * 60 * 60 * 1000,
|
|
392
|
+
yr: 365 * 24 * 60 * 60 * 1000,
|
|
393
|
+
year: 365 * 24 * 60 * 60 * 1000,
|
|
394
|
+
years: 365 * 24 * 60 * 60 * 1000,
|
|
395
|
+
}
|
|
396
|
+
return unitMap[unitLower] ?? null
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Format a timestamp for display
|
|
401
|
+
*/
|
|
402
|
+
export function formatTimestamp(timestampMs: number): string {
|
|
403
|
+
return new Date(timestampMs).toISOString()
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// ============================================================================
|
|
407
|
+
// SQL AS OF Parser
|
|
408
|
+
// ============================================================================
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* SQL AS OF clause pattern
|
|
412
|
+
* Matches: AS OF TIMESTAMP '2024-01-01' or AS OF TIMESTAMP '2024-01-01T00:00:00Z'
|
|
413
|
+
*/
|
|
414
|
+
const AS_OF_TIMESTAMP_PATTERN =
|
|
415
|
+
/\bAS\s+OF\s+TIMESTAMP\s+['"]([^'"]+)['"]/i
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* SQL AS OF SYSTEM TIME pattern (alternative syntax)
|
|
419
|
+
*/
|
|
420
|
+
const AS_OF_SYSTEM_TIME_PATTERN =
|
|
421
|
+
/\bAS\s+OF\s+SYSTEM\s+TIME\s+['"]([^'"]+)['"]/i
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* SQL FOR SYSTEM_TIME AS OF pattern
|
|
425
|
+
*/
|
|
426
|
+
const FOR_SYSTEM_TIME_AS_OF_PATTERN =
|
|
427
|
+
/\bFOR\s+SYSTEM_TIME\s+AS\s+OF\s+['"]([^'"]+)['"]/i
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* SQL VERSIONS BETWEEN pattern
|
|
431
|
+
* Matches: VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND '2024-01-15'
|
|
432
|
+
* Also matches: VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND TIMESTAMP '2024-01-15'
|
|
433
|
+
* Also matches: VERSIONS BETWEEN '2024-01-01' AND '2024-01-15'
|
|
434
|
+
*/
|
|
435
|
+
const VERSIONS_BETWEEN_PATTERN =
|
|
436
|
+
/\bVERSIONS\s+BETWEEN\s+(?:TIMESTAMP\s+)?['"]([^'"]+)['"]\s+AND\s+(?:TIMESTAMP\s+)?['"]([^'"]+)['"]/i
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* SQL VERSIONS BETWEEN with expression pattern
|
|
440
|
+
* Matches: VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND CURRENT_TIMESTAMP
|
|
441
|
+
* Also matches: VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND NOW()
|
|
442
|
+
*/
|
|
443
|
+
const VERSIONS_BETWEEN_EXPR_PATTERN =
|
|
444
|
+
/\bVERSIONS\s+BETWEEN\s+(?:TIMESTAMP\s+)?['"]([^'"]+)['"]\s+AND\s+(?:TIMESTAMP\s+)?(now\(\)|current_timestamp)/i
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* SQL AS OF with expression pattern (NOW() - INTERVAL '1 hour')
|
|
448
|
+
* Matches: AS OF TIMESTAMP NOW() - INTERVAL '1 hour'
|
|
449
|
+
* Also matches: AS OF TIMESTAMP CURRENT_TIMESTAMP - INTERVAL '30 minutes'
|
|
450
|
+
*/
|
|
451
|
+
const AS_OF_TIMESTAMP_EXPR_PATTERN =
|
|
452
|
+
/\bAS\s+OF\s+TIMESTAMP\s+((?:now\(\)|current_timestamp)\s*-\s*interval\s*'[^']+')/i
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* SQL AS OF with NOW() or CURRENT_TIMESTAMP (no subtraction)
|
|
456
|
+
* Matches: AS OF TIMESTAMP NOW() or AS OF TIMESTAMP CURRENT_TIMESTAMP
|
|
457
|
+
*/
|
|
458
|
+
const AS_OF_TIMESTAMP_NOW_PATTERN =
|
|
459
|
+
/\bAS\s+OF\s+TIMESTAMP\s+(now\(\)|current_timestamp)/i
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Parsed SQL with time travel information
|
|
463
|
+
*/
|
|
464
|
+
export interface ParsedTimeTravelSQL {
|
|
465
|
+
/** Original SQL */
|
|
466
|
+
originalSql: string
|
|
467
|
+
/** SQL with AS OF clause removed */
|
|
468
|
+
cleanSql: string
|
|
469
|
+
/** Parsed timestamp if AS OF was found */
|
|
470
|
+
timestamp?: ParsedTimestamp
|
|
471
|
+
/** Whether AS OF clause was found */
|
|
472
|
+
hasTimeTravelClause: boolean
|
|
473
|
+
/** The table name referenced (if detectable) */
|
|
474
|
+
tableName?: string
|
|
475
|
+
/** Query mode detected from SQL */
|
|
476
|
+
mode?: TimeTravelMode
|
|
477
|
+
/** Start timestamp for VERSIONS BETWEEN queries */
|
|
478
|
+
startTimestamp?: ParsedTimestamp
|
|
479
|
+
/** End timestamp for VERSIONS BETWEEN queries */
|
|
480
|
+
endTimestamp?: ParsedTimestamp
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Parse SQL for AS OF TIMESTAMP clause
|
|
485
|
+
*
|
|
486
|
+
* Supports the following syntax variants:
|
|
487
|
+
* - AS OF TIMESTAMP '2024-01-01T00:00:00Z' (ISO timestamp)
|
|
488
|
+
* - AS OF TIMESTAMP '1 hour ago' (relative timestamp)
|
|
489
|
+
* - AS OF TIMESTAMP NOW() - INTERVAL '1 hour' (SQL expression)
|
|
490
|
+
* - AS OF TIMESTAMP CURRENT_TIMESTAMP - INTERVAL '30 minutes'
|
|
491
|
+
* - AS OF TIMESTAMP NOW()
|
|
492
|
+
* - AS OF SYSTEM TIME '2024-01-01' (alternative syntax)
|
|
493
|
+
* - FOR SYSTEM_TIME AS OF '2024-01-01' (SQL:2011 syntax)
|
|
494
|
+
* - VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND '2024-01-15' (range query)
|
|
495
|
+
* - VERSIONS BETWEEN '2024-01-01' AND CURRENT_TIMESTAMP (range with expression)
|
|
496
|
+
*/
|
|
497
|
+
export function parseTimeTravelSQL(sql: string): ParsedTimeTravelSQL {
|
|
498
|
+
// First check for VERSIONS BETWEEN patterns (highest precedence)
|
|
499
|
+
let versionsBetweenMatch = sql.match(VERSIONS_BETWEEN_EXPR_PATTERN)
|
|
500
|
+
if (versionsBetweenMatch && versionsBetweenMatch[1] && versionsBetweenMatch[2]) {
|
|
501
|
+
const startTimestamp = parseTimestamp(versionsBetweenMatch[1])
|
|
502
|
+
const endTimestamp = parseTimestamp(versionsBetweenMatch[2])
|
|
503
|
+
const cleanSql = sql.replace(VERSIONS_BETWEEN_EXPR_PATTERN, '').replace(/\s+/g, ' ').trim()
|
|
504
|
+
const tableMatch = cleanSql.match(/\bFROM\s+["']?(\w+)["']?/i)
|
|
505
|
+
const tableName = tableMatch?.[1]
|
|
506
|
+
|
|
507
|
+
const result: ParsedTimeTravelSQL = {
|
|
508
|
+
originalSql: sql,
|
|
509
|
+
cleanSql,
|
|
510
|
+
hasTimeTravelClause: true,
|
|
511
|
+
mode: 'versions-between',
|
|
512
|
+
startTimestamp,
|
|
513
|
+
endTimestamp,
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
if (tableName) {
|
|
517
|
+
result.tableName = tableName
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
return result
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
versionsBetweenMatch = sql.match(VERSIONS_BETWEEN_PATTERN)
|
|
524
|
+
if (versionsBetweenMatch && versionsBetweenMatch[1] && versionsBetweenMatch[2]) {
|
|
525
|
+
const startTimestamp = parseTimestamp(versionsBetweenMatch[1])
|
|
526
|
+
const endTimestamp = parseTimestamp(versionsBetweenMatch[2])
|
|
527
|
+
const cleanSql = sql.replace(VERSIONS_BETWEEN_PATTERN, '').replace(/\s+/g, ' ').trim()
|
|
528
|
+
const tableMatch = cleanSql.match(/\bFROM\s+["']?(\w+)["']?/i)
|
|
529
|
+
const tableName = tableMatch?.[1]
|
|
530
|
+
|
|
531
|
+
const result: ParsedTimeTravelSQL = {
|
|
532
|
+
originalSql: sql,
|
|
533
|
+
cleanSql,
|
|
534
|
+
hasTimeTravelClause: true,
|
|
535
|
+
mode: 'versions-between',
|
|
536
|
+
startTimestamp,
|
|
537
|
+
endTimestamp,
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
if (tableName) {
|
|
541
|
+
result.tableName = tableName
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
return result
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// Define all AS OF patterns to check, in order of specificity
|
|
548
|
+
type PatternType = { pattern: RegExp; name: string }
|
|
549
|
+
const patterns: PatternType[] = [
|
|
550
|
+
{ pattern: AS_OF_TIMESTAMP_EXPR_PATTERN, name: 'expr' },
|
|
551
|
+
{ pattern: AS_OF_TIMESTAMP_NOW_PATTERN, name: 'now' },
|
|
552
|
+
{ pattern: AS_OF_TIMESTAMP_PATTERN, name: 'timestamp' },
|
|
553
|
+
{ pattern: AS_OF_SYSTEM_TIME_PATTERN, name: 'system_time' },
|
|
554
|
+
{ pattern: FOR_SYSTEM_TIME_AS_OF_PATTERN, name: 'for_system_time' },
|
|
555
|
+
]
|
|
556
|
+
|
|
557
|
+
let match: RegExpMatchArray | null = null
|
|
558
|
+
let matchedPattern: RegExp | null = null
|
|
559
|
+
|
|
560
|
+
for (const { pattern } of patterns) {
|
|
561
|
+
match = sql.match(pattern)
|
|
562
|
+
if (match) {
|
|
563
|
+
matchedPattern = pattern
|
|
564
|
+
break
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
if (!match || !match[1] || !matchedPattern) {
|
|
569
|
+
return {
|
|
570
|
+
originalSql: sql,
|
|
571
|
+
cleanSql: sql,
|
|
572
|
+
hasTimeTravelClause: false,
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
const timestampStr = match[1]
|
|
577
|
+
const timestamp = parseTimestamp(timestampStr)
|
|
578
|
+
const cleanSql = sql.replace(matchedPattern, '').replace(/\s+/g, ' ').trim()
|
|
579
|
+
|
|
580
|
+
// Try to extract table name from FROM clause
|
|
581
|
+
const tableMatch = cleanSql.match(/\bFROM\s+["']?(\w+)["']?/i)
|
|
582
|
+
const tableName = tableMatch?.[1]
|
|
583
|
+
|
|
584
|
+
const result: ParsedTimeTravelSQL = {
|
|
585
|
+
originalSql: sql,
|
|
586
|
+
cleanSql,
|
|
587
|
+
timestamp,
|
|
588
|
+
hasTimeTravelClause: true,
|
|
589
|
+
mode: 'point-in-time',
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
if (tableName) {
|
|
593
|
+
result.tableName = tableName
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
return result
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Build SQL with AS OF clause
|
|
601
|
+
*/
|
|
602
|
+
export function buildTimeTravelSQL(
|
|
603
|
+
baseSql: string,
|
|
604
|
+
timestamp: TimestampSpec,
|
|
605
|
+
tableName?: string
|
|
606
|
+
): string {
|
|
607
|
+
const parsed = parseTimestamp(timestamp)
|
|
608
|
+
const isoTimestamp = formatTimestamp(parsed.timestampMs)
|
|
609
|
+
|
|
610
|
+
// If table name provided and SQL has FROM clause, insert AS OF after table name
|
|
611
|
+
if (tableName) {
|
|
612
|
+
const tablePattern = new RegExp(`(\\bFROM\\s+["']?${tableName}["']?)`, 'i')
|
|
613
|
+
if (tablePattern.test(baseSql)) {
|
|
614
|
+
return baseSql.replace(tablePattern, `$1 AS OF TIMESTAMP '${isoTimestamp}'`)
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// Otherwise, try to insert after FROM table
|
|
619
|
+
const fromPattern = /(\bFROM\s+["']?\w+["']?)/i
|
|
620
|
+
if (fromPattern.test(baseSql)) {
|
|
621
|
+
return baseSql.replace(fromPattern, `$1 AS OF TIMESTAMP '${isoTimestamp}'`)
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// Fallback: append to end (may not be valid SQL but preserves intent)
|
|
625
|
+
return `${baseSql} AS OF TIMESTAMP '${isoTimestamp}'`
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// ============================================================================
|
|
629
|
+
// Time Travel Reader
|
|
630
|
+
// ============================================================================
|
|
631
|
+
|
|
632
|
+
/**
|
|
633
|
+
* Cache entry for manifest data
|
|
634
|
+
*/
|
|
635
|
+
interface ManifestCacheEntry {
|
|
636
|
+
data: IcebergManifestFile[]
|
|
637
|
+
expiresAt: number
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Iceberg Time Travel Reader
|
|
642
|
+
*
|
|
643
|
+
* Reads Iceberg table data at a specific point in time using snapshots.
|
|
644
|
+
*/
|
|
645
|
+
export class IcebergTimeTravelReader {
|
|
646
|
+
private bucket: R2Bucket
|
|
647
|
+
private retentionWindowMs: number
|
|
648
|
+
private maxQueryAgeMs: number
|
|
649
|
+
private enableManifestCache: boolean
|
|
650
|
+
private manifestCacheTtlMs: number
|
|
651
|
+
private manifestCache: Map<string, ManifestCacheEntry> = new Map()
|
|
652
|
+
|
|
653
|
+
constructor(config: TimeTravelReaderConfig) {
|
|
654
|
+
this.bucket = config.bucket
|
|
655
|
+
// Store retention window for future use in validation
|
|
656
|
+
this.retentionWindowMs = config.retentionWindowMs ?? 30 * 24 * 60 * 60 * 1000 // 30 days
|
|
657
|
+
this.maxQueryAgeMs = config.maxQueryAgeMs ?? 90 * 24 * 60 * 60 * 1000 // 90 days
|
|
658
|
+
this.enableManifestCache = config.enableManifestCache ?? true
|
|
659
|
+
this.manifestCacheTtlMs = config.manifestCacheTtlMs ?? 5 * 60 * 1000 // 5 minutes
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* Get the retention window in milliseconds
|
|
664
|
+
*/
|
|
665
|
+
getRetentionWindowMs(): number {
|
|
666
|
+
return this.retentionWindowMs
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/**
|
|
670
|
+
* Find the snapshot that was current at the given timestamp
|
|
671
|
+
*/
|
|
672
|
+
async findSnapshotAtTimestamp(
|
|
673
|
+
metadata: IcebergTableMetadata,
|
|
674
|
+
timestamp: TimestampSpec
|
|
675
|
+
): Promise<ResolvedSnapshot> {
|
|
676
|
+
const parsed = parseTimestamp(timestamp)
|
|
677
|
+
const targetMs = parsed.timestampMs
|
|
678
|
+
|
|
679
|
+
const snapshots = metadata.snapshots ?? []
|
|
680
|
+
|
|
681
|
+
if (snapshots.length === 0) {
|
|
682
|
+
throw new NoSnapshotFoundError(targetMs)
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
// Sort snapshots by timestamp descending
|
|
686
|
+
const sortedSnapshots = [...snapshots].sort(
|
|
687
|
+
(a, b) => b['timestamp-ms'] - a['timestamp-ms']
|
|
688
|
+
)
|
|
689
|
+
|
|
690
|
+
// Find the oldest and newest snapshots for range checking
|
|
691
|
+
const oldestSnapshot = sortedSnapshots[sortedSnapshots.length - 1]!
|
|
692
|
+
const newestSnapshot = sortedSnapshots[0]!
|
|
693
|
+
|
|
694
|
+
// Check if timestamp is in valid range
|
|
695
|
+
const now = Date.now()
|
|
696
|
+
if (targetMs > now) {
|
|
697
|
+
throw new TimestampOutOfRangeError(
|
|
698
|
+
targetMs,
|
|
699
|
+
oldestSnapshot['timestamp-ms'],
|
|
700
|
+
now
|
|
701
|
+
)
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
if (targetMs < oldestSnapshot['timestamp-ms'] - this.maxQueryAgeMs) {
|
|
705
|
+
throw new TimestampOutOfRangeError(
|
|
706
|
+
targetMs,
|
|
707
|
+
oldestSnapshot['timestamp-ms'],
|
|
708
|
+
newestSnapshot['timestamp-ms']
|
|
709
|
+
)
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
// Find the snapshot that was current at the target timestamp
|
|
713
|
+
// This is the newest snapshot with timestamp <= target
|
|
714
|
+
let selectedSnapshot: IcebergSnapshot | null = null
|
|
715
|
+
let timeDiff = Infinity
|
|
716
|
+
|
|
717
|
+
for (const snapshot of sortedSnapshots) {
|
|
718
|
+
const snapshotTs = snapshot['timestamp-ms']
|
|
719
|
+
if (snapshotTs <= targetMs) {
|
|
720
|
+
const diff = targetMs - snapshotTs
|
|
721
|
+
if (diff < timeDiff) {
|
|
722
|
+
selectedSnapshot = snapshot
|
|
723
|
+
timeDiff = diff
|
|
724
|
+
}
|
|
725
|
+
break // Since sorted descending, first match is best
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// If no snapshot found at or before target, use oldest
|
|
730
|
+
if (!selectedSnapshot) {
|
|
731
|
+
selectedSnapshot = oldestSnapshot
|
|
732
|
+
timeDiff = Math.abs(targetMs - oldestSnapshot['timestamp-ms'])
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
return {
|
|
736
|
+
snapshot: selectedSnapshot,
|
|
737
|
+
timestampMs: targetMs,
|
|
738
|
+
exactMatch: timeDiff === 0,
|
|
739
|
+
timeDifferenceMs: timeDiff,
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* Get the snapshot range for a time range query
|
|
745
|
+
*/
|
|
746
|
+
async findSnapshotsInRange(
|
|
747
|
+
metadata: IcebergTableMetadata,
|
|
748
|
+
fromTimestamp: TimestampSpec,
|
|
749
|
+
toTimestamp: TimestampSpec
|
|
750
|
+
): Promise<IcebergSnapshot[]> {
|
|
751
|
+
const from = parseTimestamp(fromTimestamp)
|
|
752
|
+
const to = parseTimestamp(toTimestamp)
|
|
753
|
+
|
|
754
|
+
const snapshots = metadata.snapshots ?? []
|
|
755
|
+
|
|
756
|
+
return snapshots.filter((snapshot) => {
|
|
757
|
+
const ts = snapshot['timestamp-ms']
|
|
758
|
+
return ts >= from.timestampMs && ts <= to.timestampMs
|
|
759
|
+
})
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/**
|
|
763
|
+
* Get data files for a snapshot
|
|
764
|
+
* @param _metadata - Table metadata (reserved for future schema validation)
|
|
765
|
+
* @param snapshot - The snapshot to read files from
|
|
766
|
+
*/
|
|
767
|
+
async getDataFilesForSnapshot(
|
|
768
|
+
_metadata: IcebergTableMetadata,
|
|
769
|
+
snapshot: IcebergSnapshot
|
|
770
|
+
): Promise<ResolvedDataFiles> {
|
|
771
|
+
const manifestListPath = snapshot['manifest-list']
|
|
772
|
+
|
|
773
|
+
// Load manifest list
|
|
774
|
+
const manifestList = await this.loadManifestList(manifestListPath)
|
|
775
|
+
|
|
776
|
+
// Load all manifests and collect data files
|
|
777
|
+
const dataFiles: IcebergDataFile[] = []
|
|
778
|
+
|
|
779
|
+
for (const manifest of manifestList) {
|
|
780
|
+
const entries = await this.loadManifest(manifest['manifest-path'])
|
|
781
|
+
|
|
782
|
+
for (const entry of entries) {
|
|
783
|
+
// Only include EXISTING (0) and ADDED (1) entries
|
|
784
|
+
// DELETED (2) entries are excluded
|
|
785
|
+
if (entry.status === 0 || entry.status === 1) {
|
|
786
|
+
dataFiles.push(entry['data-file'])
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
// Calculate total records
|
|
792
|
+
const totalRecords = dataFiles.reduce(
|
|
793
|
+
(sum, file) => sum + file['record-count'],
|
|
794
|
+
0
|
|
795
|
+
)
|
|
796
|
+
|
|
797
|
+
return {
|
|
798
|
+
dataFiles,
|
|
799
|
+
metadata: {
|
|
800
|
+
snapshotId: snapshot['snapshot-id'],
|
|
801
|
+
snapshotTimestampMs: snapshot['timestamp-ms'],
|
|
802
|
+
requestedTimestampMs: snapshot['timestamp-ms'],
|
|
803
|
+
mode: 'point-in-time',
|
|
804
|
+
dataFilesScanned: dataFiles.length,
|
|
805
|
+
totalRecords,
|
|
806
|
+
},
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* Resolve data files for a time travel query
|
|
812
|
+
*/
|
|
813
|
+
async resolveDataFiles(
|
|
814
|
+
metadata: IcebergTableMetadata,
|
|
815
|
+
options: TimeTravelQueryOptions
|
|
816
|
+
): Promise<ResolvedDataFiles> {
|
|
817
|
+
// Determine query mode
|
|
818
|
+
let mode: TimeTravelMode = options.mode ?? 'latest'
|
|
819
|
+
|
|
820
|
+
if (options.asOf && !options.mode) {
|
|
821
|
+
mode = 'point-in-time'
|
|
822
|
+
} else if (options.fromTimestamp && options.toTimestamp && !options.mode) {
|
|
823
|
+
mode = 'range'
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
switch (mode) {
|
|
827
|
+
case 'point-in-time': {
|
|
828
|
+
if (!options.asOf) {
|
|
829
|
+
throw new Error('asOf timestamp is required for point-in-time queries')
|
|
830
|
+
}
|
|
831
|
+
const resolved = await this.findSnapshotAtTimestamp(metadata, options.asOf)
|
|
832
|
+
const result = await this.getDataFilesForSnapshot(metadata, resolved.snapshot)
|
|
833
|
+
result.metadata.requestedTimestampMs = resolved.timestampMs
|
|
834
|
+
result.metadata.mode = mode
|
|
835
|
+
return result
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
case 'versions-between': {
|
|
839
|
+
if (!options.fromTimestamp || !options.toTimestamp) {
|
|
840
|
+
throw new Error('fromTimestamp and toTimestamp are required for versions-between queries')
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
const fromParsed = parseTimestamp(options.fromTimestamp)
|
|
844
|
+
const toParsed = parseTimestamp(options.toTimestamp)
|
|
845
|
+
|
|
846
|
+
// Find all snapshots in the range
|
|
847
|
+
const snapshots = await this.findSnapshotsInRange(
|
|
848
|
+
metadata,
|
|
849
|
+
fromParsed.timestampMs,
|
|
850
|
+
toParsed.timestampMs
|
|
851
|
+
)
|
|
852
|
+
|
|
853
|
+
if (snapshots.length === 0) {
|
|
854
|
+
throw new NoSnapshotFoundError(fromParsed.timestampMs)
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
// Collect all data files from all snapshots in the range
|
|
858
|
+
const allDataFiles: IcebergDataFile[] = []
|
|
859
|
+
let totalRecords = 0
|
|
860
|
+
|
|
861
|
+
for (const snapshot of snapshots) {
|
|
862
|
+
const { dataFiles } = await this.getDataFilesForSnapshot(metadata, snapshot)
|
|
863
|
+
allDataFiles.push(...dataFiles)
|
|
864
|
+
totalRecords += dataFiles.reduce((sum, file) => sum + file['record-count'], 0)
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
// Deduplicate data files by file path
|
|
868
|
+
const uniqueDataFiles = Array.from(
|
|
869
|
+
new Map(allDataFiles.map(file => [file['file-path'], file])).values()
|
|
870
|
+
)
|
|
871
|
+
|
|
872
|
+
return {
|
|
873
|
+
dataFiles: uniqueDataFiles,
|
|
874
|
+
metadata: {
|
|
875
|
+
snapshotId: snapshots[snapshots.length - 1]!['snapshot-id'],
|
|
876
|
+
snapshotTimestampMs: snapshots[snapshots.length - 1]!['timestamp-ms'],
|
|
877
|
+
requestedTimestampMs: fromParsed.timestampMs,
|
|
878
|
+
mode: 'versions-between',
|
|
879
|
+
dataFilesScanned: uniqueDataFiles.length,
|
|
880
|
+
totalRecords,
|
|
881
|
+
snapshotCount: snapshots.length,
|
|
882
|
+
startTimestampMs: fromParsed.timestampMs,
|
|
883
|
+
endTimestampMs: toParsed.timestampMs,
|
|
884
|
+
},
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
case 'range': {
|
|
889
|
+
if (!options.fromTimestamp || !options.toTimestamp) {
|
|
890
|
+
throw new Error('fromTimestamp and toTimestamp are required for range queries')
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
// For range queries, get the end snapshot's data files
|
|
894
|
+
// The data represents the state at the end of the range
|
|
895
|
+
const toResolved = await this.findSnapshotAtTimestamp(
|
|
896
|
+
metadata,
|
|
897
|
+
options.toTimestamp
|
|
898
|
+
)
|
|
899
|
+
const result = await this.getDataFilesForSnapshot(metadata, toResolved.snapshot)
|
|
900
|
+
result.metadata.mode = mode
|
|
901
|
+
return result
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
case 'latest':
|
|
905
|
+
default: {
|
|
906
|
+
// Use current snapshot
|
|
907
|
+
const currentSnapshotId = metadata['current-snapshot-id']
|
|
908
|
+
if (!currentSnapshotId) {
|
|
909
|
+
throw new NoSnapshotFoundError(Date.now())
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
const snapshot = metadata.snapshots?.find(
|
|
913
|
+
(s) => s['snapshot-id'] === currentSnapshotId
|
|
914
|
+
)
|
|
915
|
+
if (!snapshot) {
|
|
916
|
+
throw new NoSnapshotFoundError(Date.now())
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
const result = await this.getDataFilesForSnapshot(metadata, snapshot)
|
|
920
|
+
result.metadata.mode = mode
|
|
921
|
+
return result
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/**
|
|
927
|
+
* Get available time range for queries
|
|
928
|
+
*/
|
|
929
|
+
getAvailableTimeRange(metadata: IcebergTableMetadata): {
|
|
930
|
+
oldest: number | null
|
|
931
|
+
newest: number | null
|
|
932
|
+
} {
|
|
933
|
+
const snapshots = metadata.snapshots ?? []
|
|
934
|
+
|
|
935
|
+
if (snapshots.length === 0) {
|
|
936
|
+
return { oldest: null, newest: null }
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
const timestamps = snapshots.map((s) => s['timestamp-ms'])
|
|
940
|
+
return {
|
|
941
|
+
oldest: Math.min(...timestamps),
|
|
942
|
+
newest: Math.max(...timestamps),
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
/**
|
|
947
|
+
* List all available snapshots with their timestamps
|
|
948
|
+
*/
|
|
949
|
+
listSnapshots(
|
|
950
|
+
metadata: IcebergTableMetadata
|
|
951
|
+
): Array<{ snapshotId: number; timestampMs: number; timestamp: string }> {
|
|
952
|
+
const snapshots = metadata.snapshots ?? []
|
|
953
|
+
|
|
954
|
+
return snapshots
|
|
955
|
+
.map((s) => ({
|
|
956
|
+
snapshotId: s['snapshot-id'],
|
|
957
|
+
timestampMs: s['timestamp-ms'],
|
|
958
|
+
timestamp: formatTimestamp(s['timestamp-ms']),
|
|
959
|
+
}))
|
|
960
|
+
.sort((a, b) => b.timestampMs - a.timestampMs)
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
/**
|
|
964
|
+
* Load manifest list from R2
|
|
965
|
+
*/
|
|
966
|
+
private async loadManifestList(path: string): Promise<IcebergManifestFile[]> {
|
|
967
|
+
// Check cache
|
|
968
|
+
if (this.enableManifestCache) {
|
|
969
|
+
const cached = this.manifestCache.get(path)
|
|
970
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
971
|
+
return cached.data
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
const obj = await this.bucket.get(path)
|
|
976
|
+
if (!obj) {
|
|
977
|
+
throw new Error(`Manifest list not found: ${path}`)
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
const data = JSON.parse(await obj.text())
|
|
981
|
+
const manifests: IcebergManifestFile[] = data.manifests ?? []
|
|
982
|
+
|
|
983
|
+
// Cache the result
|
|
984
|
+
if (this.enableManifestCache) {
|
|
985
|
+
this.manifestCache.set(path, {
|
|
986
|
+
data: manifests,
|
|
987
|
+
expiresAt: Date.now() + this.manifestCacheTtlMs,
|
|
988
|
+
})
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
return manifests
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
/**
|
|
995
|
+
* Load manifest entries from R2
|
|
996
|
+
*/
|
|
997
|
+
private async loadManifest(path: string): Promise<IcebergManifestEntry[]> {
|
|
998
|
+
const cacheKey = `manifest:${path}`
|
|
999
|
+
|
|
1000
|
+
// Check cache (reuse manifest cache for entries too)
|
|
1001
|
+
if (this.enableManifestCache) {
|
|
1002
|
+
const cached = this.manifestCache.get(cacheKey)
|
|
1003
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
1004
|
+
return cached.data as unknown as IcebergManifestEntry[]
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
const obj = await this.bucket.get(path)
|
|
1009
|
+
if (!obj) {
|
|
1010
|
+
throw new Error(`Manifest not found: ${path}`)
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
const data = JSON.parse(await obj.text())
|
|
1014
|
+
const entries: IcebergManifestEntry[] = data.entries ?? []
|
|
1015
|
+
|
|
1016
|
+
// Cache the result
|
|
1017
|
+
if (this.enableManifestCache) {
|
|
1018
|
+
this.manifestCache.set(cacheKey, {
|
|
1019
|
+
data: entries as unknown as IcebergManifestFile[],
|
|
1020
|
+
expiresAt: Date.now() + this.manifestCacheTtlMs,
|
|
1021
|
+
})
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
return entries
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
/**
|
|
1028
|
+
* Clear the manifest cache
|
|
1029
|
+
*/
|
|
1030
|
+
clearCache(): void {
|
|
1031
|
+
this.manifestCache.clear()
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
/**
|
|
1035
|
+
* Get cache statistics
|
|
1036
|
+
*/
|
|
1037
|
+
getCacheStats(): { size: number; ttlMs: number } {
|
|
1038
|
+
return {
|
|
1039
|
+
size: this.manifestCache.size,
|
|
1040
|
+
ttlMs: this.manifestCacheTtlMs,
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
/**
|
|
1046
|
+
* Create a time travel reader
|
|
1047
|
+
*/
|
|
1048
|
+
export function createTimeTravelReader(
|
|
1049
|
+
config: TimeTravelReaderConfig
|
|
1050
|
+
): IcebergTimeTravelReader {
|
|
1051
|
+
return new IcebergTimeTravelReader(config)
|
|
1052
|
+
}
|