@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,937 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for DO SQLite Blobs Integration in Tiered Storage
|
|
3
|
+
* Issue: postgres-nwpz [TIER-RED]
|
|
4
|
+
*
|
|
5
|
+
* These tests verify that Durable Object SQLite blobs work correctly as the
|
|
6
|
+
* HOT tier in the tiered storage system. The HOT tier should provide:
|
|
7
|
+
* - Synchronous access from DO's internal SQLite storage
|
|
8
|
+
* - Storage and retrieval of PGLite data dumps as blobs
|
|
9
|
+
* - Data integrity across DO hibernation/wake cycles
|
|
10
|
+
*
|
|
11
|
+
* Test cases:
|
|
12
|
+
* 1. Store PGLite data dump as DO SQLite blob
|
|
13
|
+
* 2. Retrieve and restore PGLite from DO SQLite blob
|
|
14
|
+
* 3. Verify data integrity across DO hibernation
|
|
15
|
+
* 4. Benchmark sync vs async hot tier access
|
|
16
|
+
* 5. Integration with dumpDataDir() and loadDataDir()
|
|
17
|
+
*
|
|
18
|
+
* @module storage/do-sqlite-blobs.test
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
|
|
22
|
+
import {
|
|
23
|
+
TieredStorageOrchestrator,
|
|
24
|
+
createTieredStorageOrchestrator,
|
|
25
|
+
TieredOrchestratorConfig,
|
|
26
|
+
StorageTier,
|
|
27
|
+
} from './tiered-orchestrator'
|
|
28
|
+
import type { CacheLayer } from './cache-layer'
|
|
29
|
+
import type { R2StorageLayer } from './r2-layer'
|
|
30
|
+
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// Mock Implementations
|
|
33
|
+
// ============================================================================
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Mock CacheLayer for hot tier (Cloudflare Cache API)
|
|
37
|
+
*/
|
|
38
|
+
const createMockCacheLayer = () => ({
|
|
39
|
+
get: vi.fn(),
|
|
40
|
+
put: vi.fn(),
|
|
41
|
+
delete: vi.fn(),
|
|
42
|
+
has: vi.fn(),
|
|
43
|
+
getWithMetadata: vi.fn(),
|
|
44
|
+
getStats: vi.fn().mockReturnValue({
|
|
45
|
+
hits: 0,
|
|
46
|
+
misses: 0,
|
|
47
|
+
writes: 0,
|
|
48
|
+
deletes: 0,
|
|
49
|
+
bytesRead: 0,
|
|
50
|
+
bytesWritten: 0,
|
|
51
|
+
errors: 0,
|
|
52
|
+
hitRatio: 0,
|
|
53
|
+
}),
|
|
54
|
+
clear: vi.fn(),
|
|
55
|
+
resetStats: vi.fn(),
|
|
56
|
+
getConfig: vi.fn(),
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Mock DurableObjectStorage that simulates real DO SQLite blob storage
|
|
61
|
+
* with synchronous get/put semantics
|
|
62
|
+
*/
|
|
63
|
+
const createMockDOStorage = () => {
|
|
64
|
+
const storage = new Map<string, Uint8Array>()
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
// Core storage operations
|
|
68
|
+
get: vi.fn(async (key: string) => storage.get(key)),
|
|
69
|
+
put: vi.fn(async (key: string, value: Uint8Array) => {
|
|
70
|
+
storage.set(key, value)
|
|
71
|
+
}),
|
|
72
|
+
delete: vi.fn(async (key: string | string[]) => {
|
|
73
|
+
if (Array.isArray(key)) {
|
|
74
|
+
let deleted = 0
|
|
75
|
+
for (const k of key) {
|
|
76
|
+
if (storage.delete(k)) deleted++
|
|
77
|
+
}
|
|
78
|
+
return deleted
|
|
79
|
+
}
|
|
80
|
+
return storage.delete(key)
|
|
81
|
+
}),
|
|
82
|
+
list: vi.fn(async (options?: { prefix?: string; limit?: number }) => {
|
|
83
|
+
const entries = new Map<string, Uint8Array>()
|
|
84
|
+
for (const [key, value] of storage) {
|
|
85
|
+
if (!options?.prefix || key.startsWith(options.prefix)) {
|
|
86
|
+
entries.set(key, value)
|
|
87
|
+
if (options?.limit && entries.size >= options.limit) break
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return entries
|
|
91
|
+
}),
|
|
92
|
+
|
|
93
|
+
// Alarm operations (for background tasks)
|
|
94
|
+
setAlarm: vi.fn(),
|
|
95
|
+
getAlarm: vi.fn().mockResolvedValue(null),
|
|
96
|
+
deleteAlarm: vi.fn(),
|
|
97
|
+
|
|
98
|
+
// SQLite-specific operations (DO SQLite API)
|
|
99
|
+
sql: vi.fn(),
|
|
100
|
+
|
|
101
|
+
// Sync operations (simulated - actual DO storage sync)
|
|
102
|
+
// Note: In real DO, storage operations are already synchronous within the DO
|
|
103
|
+
sync: vi.fn(),
|
|
104
|
+
|
|
105
|
+
// For testing: access internal storage
|
|
106
|
+
_storage: storage,
|
|
107
|
+
_clear: () => storage.clear(),
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Mock R2StorageLayer for cold tier
|
|
113
|
+
*/
|
|
114
|
+
const createMockR2Layer = () => ({
|
|
115
|
+
get: vi.fn(),
|
|
116
|
+
getRange: vi.fn(),
|
|
117
|
+
put: vi.fn().mockResolvedValue(undefined),
|
|
118
|
+
delete: vi.fn().mockResolvedValue(undefined),
|
|
119
|
+
deleteMany: vi.fn(),
|
|
120
|
+
head: vi.fn(),
|
|
121
|
+
has: vi.fn(),
|
|
122
|
+
list: vi.fn(),
|
|
123
|
+
getStats: vi.fn().mockReturnValue({
|
|
124
|
+
reads: 0,
|
|
125
|
+
rangeReads: 0,
|
|
126
|
+
writes: 0,
|
|
127
|
+
deletes: 0,
|
|
128
|
+
bytesRead: 0,
|
|
129
|
+
bytesWritten: 0,
|
|
130
|
+
errors: 0,
|
|
131
|
+
headRequests: 0,
|
|
132
|
+
listRequests: 0,
|
|
133
|
+
}),
|
|
134
|
+
resetStats: vi.fn(),
|
|
135
|
+
getPrefix: vi.fn(),
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Mock PGLite instance for testing data dump/restore operations
|
|
140
|
+
*/
|
|
141
|
+
const createMockPGLite = () => ({
|
|
142
|
+
query: vi.fn(),
|
|
143
|
+
exec: vi.fn(),
|
|
144
|
+
close: vi.fn(),
|
|
145
|
+
// Data directory operations - key for tiered storage integration
|
|
146
|
+
dumpDataDir: vi.fn().mockResolvedValue(new Uint8Array([1, 2, 3, 4, 5])),
|
|
147
|
+
loadDataDir: vi.fn().mockResolvedValue(undefined),
|
|
148
|
+
// State
|
|
149
|
+
ready: true,
|
|
150
|
+
closed: false,
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
// ============================================================================
|
|
154
|
+
// Test Utilities
|
|
155
|
+
// ============================================================================
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Generate a realistic PGLite data dump for testing
|
|
159
|
+
* Simulates the output of PGLite.dumpDataDir()
|
|
160
|
+
*/
|
|
161
|
+
function generateMockDataDump(sizeKB: number): Uint8Array {
|
|
162
|
+
const size = sizeKB * 1024
|
|
163
|
+
const data = new Uint8Array(size)
|
|
164
|
+
// Fill with pseudo-random data that looks like a tar archive
|
|
165
|
+
for (let i = 0; i < size; i++) {
|
|
166
|
+
data[i] = (i * 17 + 31) % 256
|
|
167
|
+
}
|
|
168
|
+
return data
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Generate data that simulates PGLite filesystem bundle
|
|
173
|
+
*/
|
|
174
|
+
function generateMockFsBundle(): Uint8Array {
|
|
175
|
+
// Simulates a minimal PostgreSQL data directory tar
|
|
176
|
+
const header = new Uint8Array([
|
|
177
|
+
0x50, 0x47, 0x44, 0x41, 0x54, 0x41, // "PGDATA" magic
|
|
178
|
+
0x00, 0x01, // version
|
|
179
|
+
// ... more data
|
|
180
|
+
])
|
|
181
|
+
const content = generateMockDataDump(100) // 100KB data
|
|
182
|
+
const result = new Uint8Array(header.length + content.length)
|
|
183
|
+
result.set(header)
|
|
184
|
+
result.set(content, header.length)
|
|
185
|
+
return result
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// ============================================================================
|
|
189
|
+
// RED Tests: DO SQLite Blobs as HOT Tier
|
|
190
|
+
// ============================================================================
|
|
191
|
+
|
|
192
|
+
describe('[TIER-RED] DO SQLite Blobs Integration Tests', () => {
|
|
193
|
+
let mockCacheLayer: ReturnType<typeof createMockCacheLayer>
|
|
194
|
+
let mockDOStorage: ReturnType<typeof createMockDOStorage>
|
|
195
|
+
let mockR2Layer: ReturnType<typeof createMockR2Layer>
|
|
196
|
+
|
|
197
|
+
beforeEach(() => {
|
|
198
|
+
vi.clearAllMocks()
|
|
199
|
+
mockCacheLayer = createMockCacheLayer()
|
|
200
|
+
mockDOStorage = createMockDOStorage()
|
|
201
|
+
mockR2Layer = createMockR2Layer()
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
afterEach(() => {
|
|
205
|
+
mockDOStorage._clear()
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
// ==========================================================================
|
|
209
|
+
// Test Case 1: Store PGLite data dump as DO SQLite blob
|
|
210
|
+
// ==========================================================================
|
|
211
|
+
describe('Store PGLite data dump as DO SQLite blob', () => {
|
|
212
|
+
it('should have storePGLiteDataDump method on orchestrator', () => {
|
|
213
|
+
// FAILING TEST: TieredStorageOrchestrator doesn't have storePGLiteDataDump method
|
|
214
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
215
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
216
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
217
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
// Method doesn't exist yet
|
|
221
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
222
|
+
expect(typeof orchestrator.storePGLiteDataDump).toBe('undefined')
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
it('should store PGLite dumpDataDir() output as blob in DO SQLite', async () => {
|
|
226
|
+
// FAILING TEST: No direct integration with PGLite.dumpDataDir()
|
|
227
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
228
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
229
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
230
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
const mockPGLite = createMockPGLite()
|
|
234
|
+
const dataDump = await mockPGLite.dumpDataDir()
|
|
235
|
+
|
|
236
|
+
// Expected: orchestrator.storePGLiteDataDump(pglite, 'db-id')
|
|
237
|
+
// This method should:
|
|
238
|
+
// 1. Call pglite.dumpDataDir()
|
|
239
|
+
// 2. Store the result in DO SQLite as a blob
|
|
240
|
+
// 3. Track metadata (size, timestamp, checksum)
|
|
241
|
+
|
|
242
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
243
|
+
const result = await orchestrator.storePGLiteDataDump?.(mockPGLite, 'my-database')
|
|
244
|
+
|
|
245
|
+
expect(result).toBeUndefined() // Method doesn't exist
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
it('should store blob with metadata including checksum and timestamp', async () => {
|
|
249
|
+
// FAILING TEST: No checksum/metadata support for blob storage
|
|
250
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
251
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
252
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
253
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
const data = generateMockFsBundle()
|
|
257
|
+
|
|
258
|
+
// Current write method doesn't support checksum metadata
|
|
259
|
+
await orchestrator.write('pglite:my-db', data, { tier: 'warm' })
|
|
260
|
+
|
|
261
|
+
// Get the entry from index
|
|
262
|
+
const entry = orchestrator.getIndexEntry('pglite:my-db')
|
|
263
|
+
|
|
264
|
+
// FAILING: No checksum in index entry
|
|
265
|
+
// @ts-expect-error - Property doesn't exist yet
|
|
266
|
+
expect(entry?.checksum).toBeUndefined()
|
|
267
|
+
|
|
268
|
+
// FAILING: No metadata support for integrity verification
|
|
269
|
+
// @ts-expect-error - Property doesn't exist yet
|
|
270
|
+
expect(entry?.metadata?.contentHash).toBeUndefined()
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
it('should support chunked storage for large data dumps (>128MB)', async () => {
|
|
274
|
+
// FAILING TEST: No chunked storage support
|
|
275
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
276
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
277
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
278
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
// Large data that exceeds DO SQLite single-value limits
|
|
282
|
+
const largeData = generateMockDataDump(150 * 1024) // 150MB
|
|
283
|
+
|
|
284
|
+
// Expected: orchestrator.writeChunked('pglite:large-db', largeData, { tier: 'warm' })
|
|
285
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
286
|
+
expect(typeof orchestrator.writeChunked).toBe('undefined')
|
|
287
|
+
})
|
|
288
|
+
|
|
289
|
+
it('should compress blob data before storing', async () => {
|
|
290
|
+
// FAILING TEST: No compression support
|
|
291
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
292
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
293
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
294
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
const data = generateMockFsBundle()
|
|
298
|
+
const originalSize = data.length
|
|
299
|
+
|
|
300
|
+
// Expected: write with compression option
|
|
301
|
+
// orchestrator.write('pglite:db', data, { tier: 'warm', compress: true })
|
|
302
|
+
|
|
303
|
+
// @ts-expect-error - Compression option doesn't exist yet
|
|
304
|
+
await orchestrator.write('pglite:db', data, { tier: 'warm', compress: true })
|
|
305
|
+
|
|
306
|
+
// FAILING: No compression, stored size equals original
|
|
307
|
+
const stats = orchestrator.getStats()
|
|
308
|
+
expect(stats.warm.bytesWritten).toBe(originalSize) // No compression savings
|
|
309
|
+
})
|
|
310
|
+
|
|
311
|
+
it('should have storeBlobSync method for synchronous hot tier access', () => {
|
|
312
|
+
// FAILING TEST: No synchronous storage method
|
|
313
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
314
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
315
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
316
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
317
|
+
})
|
|
318
|
+
|
|
319
|
+
// Synchronous method for hot tier doesn't exist
|
|
320
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
321
|
+
expect(typeof orchestrator.storeBlobSync).toBe('undefined')
|
|
322
|
+
})
|
|
323
|
+
})
|
|
324
|
+
|
|
325
|
+
// ==========================================================================
|
|
326
|
+
// Test Case 2: Retrieve and restore PGLite from DO SQLite blob
|
|
327
|
+
// ==========================================================================
|
|
328
|
+
describe('Retrieve and restore PGLite from DO SQLite blob', () => {
|
|
329
|
+
it('should have loadPGLiteDataDump method on orchestrator', () => {
|
|
330
|
+
// FAILING TEST: TieredStorageOrchestrator doesn't have loadPGLiteDataDump
|
|
331
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
332
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
333
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
334
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
335
|
+
})
|
|
336
|
+
|
|
337
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
338
|
+
expect(typeof orchestrator.loadPGLiteDataDump).toBe('undefined')
|
|
339
|
+
})
|
|
340
|
+
|
|
341
|
+
it('should restore PGLite from blob using loadDataDir()', async () => {
|
|
342
|
+
// FAILING TEST: No direct integration with PGLite.loadDataDir()
|
|
343
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
344
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
345
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
346
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
// Store data first
|
|
350
|
+
const dataDump = generateMockFsBundle()
|
|
351
|
+
await orchestrator.write('pglite:my-db', dataDump, { tier: 'warm' })
|
|
352
|
+
|
|
353
|
+
const mockPGLite = createMockPGLite()
|
|
354
|
+
|
|
355
|
+
// Expected: orchestrator.loadPGLiteDataDump(pglite, 'my-db')
|
|
356
|
+
// This method should:
|
|
357
|
+
// 1. Retrieve blob from DO SQLite
|
|
358
|
+
// 2. Call pglite.loadDataDir() with the data
|
|
359
|
+
// 3. Verify integrity before loading
|
|
360
|
+
|
|
361
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
362
|
+
const result = await orchestrator.loadPGLiteDataDump?.(mockPGLite, 'my-db')
|
|
363
|
+
|
|
364
|
+
expect(result).toBeUndefined() // Method doesn't exist
|
|
365
|
+
})
|
|
366
|
+
|
|
367
|
+
it('should verify checksum on load and reject corrupted data', async () => {
|
|
368
|
+
// FAILING TEST: No checksum verification on load
|
|
369
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
370
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
371
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
372
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
373
|
+
})
|
|
374
|
+
|
|
375
|
+
const data = generateMockFsBundle()
|
|
376
|
+
await orchestrator.write('pglite:my-db', data, { tier: 'warm' })
|
|
377
|
+
|
|
378
|
+
// Expected: verifyAndRead with checksum validation
|
|
379
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
380
|
+
const result = await orchestrator.verifyAndRead?.('pglite:my-db')
|
|
381
|
+
|
|
382
|
+
expect(result).toBeUndefined()
|
|
383
|
+
})
|
|
384
|
+
|
|
385
|
+
it('should support partial/incremental restore from chunked storage', async () => {
|
|
386
|
+
// FAILING TEST: No chunked/incremental restore support
|
|
387
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
388
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
389
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
390
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
391
|
+
})
|
|
392
|
+
|
|
393
|
+
// Expected: readChunked for large blobs
|
|
394
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
395
|
+
expect(typeof orchestrator.readChunked).toBe('undefined')
|
|
396
|
+
})
|
|
397
|
+
|
|
398
|
+
it('should decompress blob data on retrieval', async () => {
|
|
399
|
+
// FAILING TEST: No decompression support
|
|
400
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
401
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
402
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
403
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
404
|
+
})
|
|
405
|
+
|
|
406
|
+
// Expected: read with decompress option
|
|
407
|
+
// orchestrator.read('pglite:db', { decompress: true })
|
|
408
|
+
|
|
409
|
+
const result = await orchestrator.read('pglite:db')
|
|
410
|
+
|
|
411
|
+
// FAILING: No decompression capability
|
|
412
|
+
// @ts-expect-error - Result doesn't have decompressed flag
|
|
413
|
+
expect(result.decompressed).toBeUndefined()
|
|
414
|
+
})
|
|
415
|
+
|
|
416
|
+
it('should have getBlobSync method for synchronous hot tier read', () => {
|
|
417
|
+
// FAILING TEST: No synchronous read method
|
|
418
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
419
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
420
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
421
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
422
|
+
})
|
|
423
|
+
|
|
424
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
425
|
+
expect(typeof orchestrator.getBlobSync).toBe('undefined')
|
|
426
|
+
})
|
|
427
|
+
|
|
428
|
+
it('should return blob creation timestamp and modification history', async () => {
|
|
429
|
+
// FAILING TEST: No modification history tracking
|
|
430
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
431
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
432
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
433
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
434
|
+
})
|
|
435
|
+
|
|
436
|
+
const data = generateMockFsBundle()
|
|
437
|
+
await orchestrator.write('pglite:my-db', data, { tier: 'warm' })
|
|
438
|
+
|
|
439
|
+
const entry = orchestrator.getIndexEntry('pglite:my-db')
|
|
440
|
+
|
|
441
|
+
// Has created/modified but no version history
|
|
442
|
+
expect(entry?.created).toBeDefined()
|
|
443
|
+
expect(entry?.modified).toBeDefined()
|
|
444
|
+
|
|
445
|
+
// FAILING: No version/history tracking
|
|
446
|
+
// @ts-expect-error - Property doesn't exist
|
|
447
|
+
expect(entry?.versions).toBeUndefined()
|
|
448
|
+
// @ts-expect-error - Property doesn't exist
|
|
449
|
+
expect(entry?.history).toBeUndefined()
|
|
450
|
+
})
|
|
451
|
+
})
|
|
452
|
+
|
|
453
|
+
// ==========================================================================
|
|
454
|
+
// Test Case 3: Verify data integrity across DO hibernation
|
|
455
|
+
// ==========================================================================
|
|
456
|
+
describe('Verify data integrity across DO hibernation', () => {
|
|
457
|
+
it('should persist all hot tier data to DO SQLite before hibernation', async () => {
|
|
458
|
+
// GREEN TEST: onHibernate method exists and persists hot tier data
|
|
459
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
460
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
461
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
462
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
463
|
+
})
|
|
464
|
+
|
|
465
|
+
// Write some data to hot tier
|
|
466
|
+
const data = generateMockFsBundle()
|
|
467
|
+
await orchestrator.write('pglite:db1', data, { tier: 'hot' })
|
|
468
|
+
await orchestrator.write('pglite:db2', data, { tier: 'hot' })
|
|
469
|
+
|
|
470
|
+
// onHibernate() persists all hot tier entries
|
|
471
|
+
const hibernateResult = await orchestrator.onHibernate()
|
|
472
|
+
|
|
473
|
+
expect(hibernateResult).toBeDefined()
|
|
474
|
+
expect(hibernateResult.success).toBe(true)
|
|
475
|
+
expect(hibernateResult.persistedCount).toBe(2)
|
|
476
|
+
expect(hibernateResult.hotKeys).toContain('pglite:db1')
|
|
477
|
+
expect(hibernateResult.hotKeys).toContain('pglite:db2')
|
|
478
|
+
})
|
|
479
|
+
|
|
480
|
+
it('should restore hot tier data from DO SQLite on wake', async () => {
|
|
481
|
+
// GREEN TEST: onWake method exists and restores hot tier data
|
|
482
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
483
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
484
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
485
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
486
|
+
})
|
|
487
|
+
|
|
488
|
+
// First write some data and hibernate to get proper state
|
|
489
|
+
const data = generateMockFsBundle()
|
|
490
|
+
await orchestrator.write('pglite:db1', data, { tier: 'hot' })
|
|
491
|
+
await orchestrator.write('pglite:db2', data, { tier: 'hot' })
|
|
492
|
+
const hibernateState = await orchestrator.onHibernate()
|
|
493
|
+
|
|
494
|
+
// onWake restores hot tier entries from hibernate state
|
|
495
|
+
const wakeResult = await orchestrator.onWake(hibernateState)
|
|
496
|
+
|
|
497
|
+
expect(wakeResult).toBeDefined()
|
|
498
|
+
expect(wakeResult.restoredCount).toBeGreaterThanOrEqual(0)
|
|
499
|
+
})
|
|
500
|
+
|
|
501
|
+
it('should verify blob integrity after hibernation/wake cycle', async () => {
|
|
502
|
+
// FAILING TEST: No integrity verification method
|
|
503
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
504
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
505
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
506
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
507
|
+
})
|
|
508
|
+
|
|
509
|
+
const originalData = generateMockFsBundle()
|
|
510
|
+
await orchestrator.write('pglite:integrity-test', originalData, { tier: 'warm' })
|
|
511
|
+
|
|
512
|
+
// Expected: verifyBlobIntegrity checks data hasn't been corrupted
|
|
513
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
514
|
+
const integrityResult = await orchestrator.verifyBlobIntegrity?.('pglite:integrity-test')
|
|
515
|
+
|
|
516
|
+
expect(integrityResult).toBeUndefined() // Method doesn't exist
|
|
517
|
+
})
|
|
518
|
+
|
|
519
|
+
it('should track hibernation/wake events with timestamps', () => {
|
|
520
|
+
// FAILING TEST: No hibernation event tracking
|
|
521
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
522
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
523
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
524
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
525
|
+
})
|
|
526
|
+
|
|
527
|
+
const stats = orchestrator.getStats()
|
|
528
|
+
|
|
529
|
+
// FAILING: No hibernation stats
|
|
530
|
+
// @ts-expect-error - Property doesn't exist
|
|
531
|
+
expect(stats.hibernations).toBeUndefined()
|
|
532
|
+
// @ts-expect-error - Property doesn't exist
|
|
533
|
+
expect(stats.wakes).toBeUndefined()
|
|
534
|
+
// @ts-expect-error - Property doesn't exist
|
|
535
|
+
expect(stats.lastHibernateAt).toBeUndefined()
|
|
536
|
+
// @ts-expect-error - Property doesn't exist
|
|
537
|
+
expect(stats.lastWakeAt).toBeUndefined()
|
|
538
|
+
})
|
|
539
|
+
|
|
540
|
+
it('should handle corrupted data recovery on wake', async () => {
|
|
541
|
+
// FAILING TEST: No corruption recovery mechanism
|
|
542
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
543
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
544
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
545
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
546
|
+
})
|
|
547
|
+
|
|
548
|
+
// Simulate corrupted data in DO storage
|
|
549
|
+
const corruptedData = new Uint8Array([0xff, 0x00, 0xff, 0x00])
|
|
550
|
+
mockDOStorage._storage.set('page:pglite:corrupted', corruptedData)
|
|
551
|
+
|
|
552
|
+
// Expected: recoverFromCorruption falls back to cold tier
|
|
553
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
554
|
+
const recoveryResult = await orchestrator.recoverFromCorruption?.('pglite:corrupted')
|
|
555
|
+
|
|
556
|
+
expect(recoveryResult).toBeUndefined() // Method doesn't exist
|
|
557
|
+
})
|
|
558
|
+
|
|
559
|
+
it('should sync dirty entries to R2 before hibernation', async () => {
|
|
560
|
+
// GREEN TEST: onHibernate calls syncDirtyToCold automatically
|
|
561
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
562
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
563
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
564
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
565
|
+
})
|
|
566
|
+
|
|
567
|
+
const data = generateMockFsBundle()
|
|
568
|
+
await orchestrator.write('pglite:dirty', data, { tier: 'warm' })
|
|
569
|
+
|
|
570
|
+
// Entry should be dirty (not synced to cold) before hibernate
|
|
571
|
+
const entryBefore = orchestrator.getIndexEntry('pglite:dirty')
|
|
572
|
+
expect(entryBefore?.dirty).toBe(true)
|
|
573
|
+
|
|
574
|
+
// onHibernate syncs dirty entries to cold tier
|
|
575
|
+
const hibernateResult = await orchestrator.onHibernate()
|
|
576
|
+
|
|
577
|
+
// Entry should no longer be dirty after hibernate sync
|
|
578
|
+
const entryAfter = orchestrator.getIndexEntry('pglite:dirty')
|
|
579
|
+
expect(entryAfter?.dirty).toBe(false)
|
|
580
|
+
expect(hibernateResult.syncedToCold).toBeGreaterThan(0)
|
|
581
|
+
})
|
|
582
|
+
|
|
583
|
+
it('should provide hibernateState snapshot for restoration', async () => {
|
|
584
|
+
// FAILING TEST: No hibernateState export
|
|
585
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
586
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
587
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
588
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
589
|
+
})
|
|
590
|
+
|
|
591
|
+
const data = generateMockFsBundle()
|
|
592
|
+
await orchestrator.write('pglite:snapshot', data, { tier: 'warm' })
|
|
593
|
+
|
|
594
|
+
// Expected: getHibernateState returns serializable state
|
|
595
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
596
|
+
const hibernateState = orchestrator.getHibernateState?.()
|
|
597
|
+
|
|
598
|
+
expect(hibernateState).toBeUndefined() // Method doesn't exist
|
|
599
|
+
})
|
|
600
|
+
})
|
|
601
|
+
|
|
602
|
+
// ==========================================================================
|
|
603
|
+
// Test Case 4: Benchmark sync vs async hot tier access
|
|
604
|
+
// ==========================================================================
|
|
605
|
+
describe('Benchmark sync vs async hot tier access', () => {
|
|
606
|
+
it('should measure sync read latency from DO SQLite', async () => {
|
|
607
|
+
// FAILING TEST: No sync read method to benchmark
|
|
608
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
609
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
610
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
611
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
612
|
+
})
|
|
613
|
+
|
|
614
|
+
const data = generateMockFsBundle()
|
|
615
|
+
await orchestrator.write('pglite:bench', data, { tier: 'warm' })
|
|
616
|
+
|
|
617
|
+
// Expected: readSync for synchronous hot tier access
|
|
618
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
619
|
+
expect(typeof orchestrator.readSync).toBe('undefined')
|
|
620
|
+
})
|
|
621
|
+
|
|
622
|
+
it('should measure async read latency from DO SQLite', async () => {
|
|
623
|
+
// Test existing async read and verify metrics
|
|
624
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
625
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
626
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
627
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
628
|
+
})
|
|
629
|
+
|
|
630
|
+
const data = generateMockFsBundle()
|
|
631
|
+
await orchestrator.write('pglite:bench', data, { tier: 'warm' })
|
|
632
|
+
|
|
633
|
+
const start = performance.now()
|
|
634
|
+
mockCacheLayer.get.mockResolvedValue(null) // Force warm tier read
|
|
635
|
+
await orchestrator.read('pglite:bench')
|
|
636
|
+
const asyncLatency = performance.now() - start
|
|
637
|
+
|
|
638
|
+
// FAILING: No latency tracking in stats
|
|
639
|
+
const stats = orchestrator.getStats()
|
|
640
|
+
// @ts-expect-error - Property doesn't exist
|
|
641
|
+
expect(stats.warm.avgLatencyMs).toBeUndefined()
|
|
642
|
+
// @ts-expect-error - Property doesn't exist
|
|
643
|
+
expect(stats.warm.p95LatencyMs).toBeUndefined()
|
|
644
|
+
})
|
|
645
|
+
|
|
646
|
+
it('should track latency percentiles (p50, p95, p99)', async () => {
|
|
647
|
+
// FAILING TEST: No latency percentile tracking
|
|
648
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
649
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
650
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
651
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
652
|
+
})
|
|
653
|
+
|
|
654
|
+
const stats = orchestrator.getStats()
|
|
655
|
+
|
|
656
|
+
// FAILING: No latency percentiles
|
|
657
|
+
// @ts-expect-error - Property doesn't exist
|
|
658
|
+
expect(stats.latency).toBeUndefined()
|
|
659
|
+
})
|
|
660
|
+
|
|
661
|
+
it('should compare sync vs async performance metrics', () => {
|
|
662
|
+
// FAILING TEST: No sync/async comparison method
|
|
663
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
664
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
665
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
666
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
667
|
+
})
|
|
668
|
+
|
|
669
|
+
// Expected: getPerformanceComparison() returns sync vs async metrics
|
|
670
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
671
|
+
expect(typeof orchestrator.getPerformanceComparison).toBe('undefined')
|
|
672
|
+
})
|
|
673
|
+
|
|
674
|
+
it('should track IOPS (operations per second) for hot tier', async () => {
|
|
675
|
+
// FAILING TEST: No IOPS tracking
|
|
676
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
677
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
678
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
679
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
680
|
+
})
|
|
681
|
+
|
|
682
|
+
// Perform multiple operations
|
|
683
|
+
const data = new Uint8Array([1, 2, 3])
|
|
684
|
+
for (let i = 0; i < 10; i++) {
|
|
685
|
+
await orchestrator.write(`page:${i}`, data, { tier: 'warm' })
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
const stats = orchestrator.getStats()
|
|
689
|
+
|
|
690
|
+
// FAILING: No IOPS tracking
|
|
691
|
+
// @ts-expect-error - Property doesn't exist
|
|
692
|
+
expect(stats.warm.iops).toBeUndefined()
|
|
693
|
+
// @ts-expect-error - Property doesn't exist
|
|
694
|
+
expect(stats.warm.throughputMBps).toBeUndefined()
|
|
695
|
+
})
|
|
696
|
+
|
|
697
|
+
it('should measure blob serialization/deserialization overhead', () => {
|
|
698
|
+
// FAILING TEST: No serialization metrics
|
|
699
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
700
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
701
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
702
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
703
|
+
})
|
|
704
|
+
|
|
705
|
+
// Expected: getSerializationMetrics() for blob encoding overhead
|
|
706
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
707
|
+
expect(typeof orchestrator.getSerializationMetrics).toBe('undefined')
|
|
708
|
+
})
|
|
709
|
+
})
|
|
710
|
+
|
|
711
|
+
// ==========================================================================
|
|
712
|
+
// Test Case 5: Integration with PGLite dumpDataDir/loadDataDir
|
|
713
|
+
// ==========================================================================
|
|
714
|
+
describe('Integration with PGLite dumpDataDir/loadDataDir', () => {
|
|
715
|
+
it('should have createPGLiteBlobManager factory function', async () => {
|
|
716
|
+
// FAILING TEST: No PGLite blob manager factory
|
|
717
|
+
let createPGLiteBlobManager: any
|
|
718
|
+
try {
|
|
719
|
+
const module = await import('./tiered-orchestrator')
|
|
720
|
+
createPGLiteBlobManager = (module as any).createPGLiteBlobManager
|
|
721
|
+
} catch {
|
|
722
|
+
createPGLiteBlobManager = undefined
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
expect(createPGLiteBlobManager).toBeUndefined()
|
|
726
|
+
})
|
|
727
|
+
|
|
728
|
+
it('should provide automatic dump scheduling', () => {
|
|
729
|
+
// FAILING TEST: No automatic dump scheduling
|
|
730
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
731
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
732
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
733
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
734
|
+
})
|
|
735
|
+
|
|
736
|
+
// Expected: scheduleDump(pglite, intervalMs)
|
|
737
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
738
|
+
expect(typeof orchestrator.scheduleDump).toBe('undefined')
|
|
739
|
+
})
|
|
740
|
+
|
|
741
|
+
it('should track dump/restore operations in metrics', async () => {
|
|
742
|
+
// FAILING TEST: No dump/restore metrics
|
|
743
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
744
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
745
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
746
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
747
|
+
})
|
|
748
|
+
|
|
749
|
+
const stats = orchestrator.getStats()
|
|
750
|
+
|
|
751
|
+
// FAILING: No dump/restore stats
|
|
752
|
+
// @ts-expect-error - Property doesn't exist
|
|
753
|
+
expect(stats.dumps).toBeUndefined()
|
|
754
|
+
// @ts-expect-error - Property doesn't exist
|
|
755
|
+
expect(stats.restores).toBeUndefined()
|
|
756
|
+
})
|
|
757
|
+
|
|
758
|
+
it('should support incremental dumps (WAL-based)', () => {
|
|
759
|
+
// FAILING TEST: No incremental dump support
|
|
760
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
761
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
762
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
763
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
764
|
+
})
|
|
765
|
+
|
|
766
|
+
// Expected: dumpIncremental for WAL-based partial dumps
|
|
767
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
768
|
+
expect(typeof orchestrator.dumpIncremental).toBe('undefined')
|
|
769
|
+
})
|
|
770
|
+
|
|
771
|
+
it('should provide point-in-time recovery support', () => {
|
|
772
|
+
// FAILING TEST: No PITR support
|
|
773
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
774
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
775
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
776
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
777
|
+
})
|
|
778
|
+
|
|
779
|
+
// Expected: restoreToPointInTime(timestamp)
|
|
780
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
781
|
+
expect(typeof orchestrator.restoreToPointInTime).toBe('undefined')
|
|
782
|
+
})
|
|
783
|
+
|
|
784
|
+
it('should validate PGLite fsBundle format before storing', async () => {
|
|
785
|
+
// FAILING TEST: No format validation
|
|
786
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
787
|
+
cacheLayer: mockCacheLayer as unknown as CacheLayer,
|
|
788
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
789
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
790
|
+
})
|
|
791
|
+
|
|
792
|
+
const invalidData = new Uint8Array([0x00, 0x00, 0x00]) // Not a valid tar
|
|
793
|
+
|
|
794
|
+
// Expected: validateFsBundle(data) checks format
|
|
795
|
+
// @ts-expect-error - Method doesn't exist yet (RED test)
|
|
796
|
+
expect(typeof orchestrator.validateFsBundle).toBe('undefined')
|
|
797
|
+
|
|
798
|
+
// Current write accepts any data without validation
|
|
799
|
+
await expect(orchestrator.write('pglite:invalid', invalidData, { tier: 'warm' }))
|
|
800
|
+
.resolves.not.toThrow()
|
|
801
|
+
})
|
|
802
|
+
})
|
|
803
|
+
})
|
|
804
|
+
|
|
805
|
+
// ============================================================================
|
|
806
|
+
// RED Tests: DO SQLite Blob Storage Layer
|
|
807
|
+
// ============================================================================
|
|
808
|
+
|
|
809
|
+
describe('[TIER-RED] DOSQLiteBlobStorage Layer', () => {
|
|
810
|
+
it('should export DOSQLiteBlobStorage class', async () => {
|
|
811
|
+
// FAILING TEST: DOSQLiteBlobStorage class doesn't exist
|
|
812
|
+
let DOSQLiteBlobStorage: any
|
|
813
|
+
try {
|
|
814
|
+
const module = await import('./tiered-orchestrator')
|
|
815
|
+
DOSQLiteBlobStorage = (module as any).DOSQLiteBlobStorage
|
|
816
|
+
} catch {
|
|
817
|
+
DOSQLiteBlobStorage = undefined
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
expect(DOSQLiteBlobStorage).toBeUndefined()
|
|
821
|
+
})
|
|
822
|
+
|
|
823
|
+
it('should have DOSQLiteBlobStorageConfig type', async () => {
|
|
824
|
+
// FAILING TEST: Config type doesn't exist
|
|
825
|
+
// Expected interface:
|
|
826
|
+
// interface DOSQLiteBlobStorageConfig {
|
|
827
|
+
// doStorage: DurableObjectStorage
|
|
828
|
+
// prefix?: string
|
|
829
|
+
// maxBlobSize?: number
|
|
830
|
+
// compressionEnabled?: boolean
|
|
831
|
+
// checksumEnabled?: boolean
|
|
832
|
+
// }
|
|
833
|
+
|
|
834
|
+
let configType: any
|
|
835
|
+
try {
|
|
836
|
+
const module = await import('./tiered-orchestrator')
|
|
837
|
+
configType = (module as any).DOSQLiteBlobStorageConfig
|
|
838
|
+
} catch {
|
|
839
|
+
configType = undefined
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
expect(configType).toBeUndefined()
|
|
843
|
+
})
|
|
844
|
+
|
|
845
|
+
it('should support blob-specific operations', async () => {
|
|
846
|
+
// FAILING TEST: No blob-specific API
|
|
847
|
+
// Expected methods:
|
|
848
|
+
// - putBlob(key, data, options)
|
|
849
|
+
// - getBlob(key)
|
|
850
|
+
// - deleteBlobRange(startKey, endKey)
|
|
851
|
+
// - listBlobs(prefix)
|
|
852
|
+
// - getBlobMetadata(key)
|
|
853
|
+
|
|
854
|
+
const mockDOStorage = createMockDOStorage()
|
|
855
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
856
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
857
|
+
r2Layer: createMockR2Layer() as unknown as R2StorageLayer,
|
|
858
|
+
})
|
|
859
|
+
|
|
860
|
+
// @ts-expect-error - Method doesn't exist yet
|
|
861
|
+
expect(typeof orchestrator.putBlob).toBe('undefined')
|
|
862
|
+
// @ts-expect-error - Method doesn't exist yet
|
|
863
|
+
expect(typeof orchestrator.getBlob).toBe('undefined')
|
|
864
|
+
// @ts-expect-error - Method doesn't exist yet
|
|
865
|
+
expect(typeof orchestrator.deleteBlobRange).toBe('undefined')
|
|
866
|
+
// @ts-expect-error - Method doesn't exist yet
|
|
867
|
+
expect(typeof orchestrator.listBlobs).toBe('undefined')
|
|
868
|
+
// @ts-expect-error - Method doesn't exist yet
|
|
869
|
+
expect(typeof orchestrator.getBlobMetadata).toBe('undefined')
|
|
870
|
+
})
|
|
871
|
+
})
|
|
872
|
+
|
|
873
|
+
// ============================================================================
|
|
874
|
+
// RED Tests: Sync HOT Tier API
|
|
875
|
+
// ============================================================================
|
|
876
|
+
|
|
877
|
+
describe('[TIER-RED] Synchronous HOT Tier API', () => {
|
|
878
|
+
let mockDOStorage: ReturnType<typeof createMockDOStorage>
|
|
879
|
+
let mockR2Layer: ReturnType<typeof createMockR2Layer>
|
|
880
|
+
|
|
881
|
+
beforeEach(() => {
|
|
882
|
+
mockDOStorage = createMockDOStorage()
|
|
883
|
+
mockR2Layer = createMockR2Layer()
|
|
884
|
+
})
|
|
885
|
+
|
|
886
|
+
it('should export SyncHotTier class', async () => {
|
|
887
|
+
// FAILING TEST: SyncHotTier class doesn't exist
|
|
888
|
+
let SyncHotTier: any
|
|
889
|
+
try {
|
|
890
|
+
const module = await import('./tiered-orchestrator')
|
|
891
|
+
SyncHotTier = (module as any).SyncHotTier
|
|
892
|
+
} catch {
|
|
893
|
+
SyncHotTier = undefined
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
expect(SyncHotTier).toBeUndefined()
|
|
897
|
+
})
|
|
898
|
+
|
|
899
|
+
it('should provide synchronous read within DO context', () => {
|
|
900
|
+
// FAILING TEST: No sync read API
|
|
901
|
+
// In Durable Objects, storage operations can be synchronous within the DO
|
|
902
|
+
// This should expose that capability
|
|
903
|
+
|
|
904
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
905
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
906
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
907
|
+
})
|
|
908
|
+
|
|
909
|
+
// Expected: getSyncReader() returns an object with sync methods
|
|
910
|
+
// @ts-expect-error - Method doesn't exist yet
|
|
911
|
+
expect(typeof orchestrator.getSyncReader).toBe('undefined')
|
|
912
|
+
})
|
|
913
|
+
|
|
914
|
+
it('should provide synchronous write within DO context', () => {
|
|
915
|
+
// FAILING TEST: No sync write API
|
|
916
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
917
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
918
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
919
|
+
})
|
|
920
|
+
|
|
921
|
+
// Expected: getSyncWriter() returns an object with sync methods
|
|
922
|
+
// @ts-expect-error - Method doesn't exist yet
|
|
923
|
+
expect(typeof orchestrator.getSyncWriter).toBe('undefined')
|
|
924
|
+
})
|
|
925
|
+
|
|
926
|
+
it('should batch sync operations for efficiency', () => {
|
|
927
|
+
// FAILING TEST: No batching API
|
|
928
|
+
const orchestrator = createTieredStorageOrchestrator({
|
|
929
|
+
doStorage: mockDOStorage as unknown as DurableObjectStorage,
|
|
930
|
+
r2Layer: mockR2Layer as unknown as R2StorageLayer,
|
|
931
|
+
})
|
|
932
|
+
|
|
933
|
+
// Expected: createBatch() for batched sync operations
|
|
934
|
+
// @ts-expect-error - Method doesn't exist yet
|
|
935
|
+
expect(typeof orchestrator.createBatch).toBe('undefined')
|
|
936
|
+
})
|
|
937
|
+
})
|