@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,1260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cold Start Manager - Durable Object Lifecycle Integration
|
|
3
|
+
*
|
|
4
|
+
* This module provides lifecycle-aware cold start optimization for PGLite
|
|
5
|
+
* running in Cloudflare Durable Objects. It integrates with DO hibernation
|
|
6
|
+
* to minimize latency across the full request lifecycle.
|
|
7
|
+
*
|
|
8
|
+
* ## Overview
|
|
9
|
+
*
|
|
10
|
+
* Durable Objects have a unique lifecycle:
|
|
11
|
+
* 1. **Cold start**: First request creates new DO, full initialization required
|
|
12
|
+
* 2. **Warm requests**: Subsequent requests reuse initialized state
|
|
13
|
+
* 3. **Hibernation**: After inactivity, DO hibernates to save resources
|
|
14
|
+
* 4. **Wake**: Request to hibernated DO triggers wake sequence
|
|
15
|
+
*
|
|
16
|
+
* The ColdStartManager optimizes each phase:
|
|
17
|
+
*
|
|
18
|
+
* ```
|
|
19
|
+
* ┌──────────────────────────────────────────────────────────────────────┐
|
|
20
|
+
* │ Durable Object Lifecycle │
|
|
21
|
+
* ├──────────────────────────────────────────────────────────────────────┤
|
|
22
|
+
* │ │
|
|
23
|
+
* │ Request → [Cold Start] → [Warm Requests] → [Hibernation] → Wake │
|
|
24
|
+
* │ ↓ ↓ ↓ ↓ │
|
|
25
|
+
* │ 1500ms <50ms persist <10ms │
|
|
26
|
+
* │ state │
|
|
27
|
+
* └──────────────────────────────────────────────────────────────────────┘
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* ## Performance Targets
|
|
31
|
+
*
|
|
32
|
+
* | Scenario | p50 Target | p95 Target | Notes |
|
|
33
|
+
* |----------|------------|------------|-------|
|
|
34
|
+
* | Cold start | < 800ms | < 1500ms | First request, full init |
|
|
35
|
+
* | Warm request | < 10ms | < 50ms | Cached PGLite instance |
|
|
36
|
+
* | Hibernation wake | < 5ms | < 10ms | Optimized state restore |
|
|
37
|
+
* | Hot storage access | < 1ms | < 10ms | DO SQLite, synchronous |
|
|
38
|
+
*
|
|
39
|
+
* ## Key Features
|
|
40
|
+
*
|
|
41
|
+
* ### 1. Optimized Hibernation Wake
|
|
42
|
+
*
|
|
43
|
+
* When a DO wakes from hibernation, the manager restores state from
|
|
44
|
+
* persisted storage WITHOUT reinitializing PGLite. PGLite initialization
|
|
45
|
+
* is deferred to the first actual query, achieving sub-10ms wake times.
|
|
46
|
+
*
|
|
47
|
+
* ### 2. Hot Page Tracking
|
|
48
|
+
*
|
|
49
|
+
* The manager tracks frequently accessed database pages (tables) and
|
|
50
|
+
* can prefetch them during initialization, reducing first-query latency.
|
|
51
|
+
*
|
|
52
|
+
* ### 3. Cumulative Metrics
|
|
53
|
+
*
|
|
54
|
+
* Metrics are accumulated across hibernation cycles, providing visibility
|
|
55
|
+
* into long-term performance trends.
|
|
56
|
+
*
|
|
57
|
+
* ### 4. Prefetch Strategies
|
|
58
|
+
*
|
|
59
|
+
* Configure prefetch behavior based on your workload:
|
|
60
|
+
* - `none`: No prefetching (lowest memory)
|
|
61
|
+
* - `hot-only`: Only prefetch HOT tier data
|
|
62
|
+
* - `hot-warm`: Prefetch HOT and WARM tiers (recommended)
|
|
63
|
+
* - `aggressive`: Prefetch all tiers in parallel
|
|
64
|
+
*
|
|
65
|
+
* ## Architecture
|
|
66
|
+
*
|
|
67
|
+
* ```
|
|
68
|
+
* ┌─────────────────────────────────────────────────────────────────────┐
|
|
69
|
+
* │ ColdStartManager │
|
|
70
|
+
* ├─────────────────────────────────────────────────────────────────────┤
|
|
71
|
+
* │ │
|
|
72
|
+
* │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
73
|
+
* │ │ Hibernation │ │ Hot Page │ │ Cumulative │ │
|
|
74
|
+
* │ │ State │────│ Tracking │────│ Metrics │ │
|
|
75
|
+
* │ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
76
|
+
* │ │ │ │ │
|
|
77
|
+
* │ ▼ ▼ ▼ │
|
|
78
|
+
* │ ┌─────────────────────────────────────────────────────┐ │
|
|
79
|
+
* │ │ ColdStartOptimizer │ │
|
|
80
|
+
* │ │ (WASM caching, parallel fetch, lazy init) │ │
|
|
81
|
+
* │ └─────────────────────────────────────────────────────┘ │
|
|
82
|
+
* │ │ │
|
|
83
|
+
* │ ▼ │
|
|
84
|
+
* │ ┌─────────────────────────────────────────────────────┐ │
|
|
85
|
+
* │ │ PGLite │ │
|
|
86
|
+
* │ └─────────────────────────────────────────────────────┘ │
|
|
87
|
+
* └─────────────────────────────────────────────────────────────────────┘
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* ## Usage
|
|
91
|
+
*
|
|
92
|
+
* ```typescript
|
|
93
|
+
* import pgliteWasm from './pglite.wasm'
|
|
94
|
+
* import { createColdStartManager } from '@dotdo/postgres/pglite'
|
|
95
|
+
*
|
|
96
|
+
* export class MyDurableObject {
|
|
97
|
+
* private coldStartManager: ColdStartManager
|
|
98
|
+
*
|
|
99
|
+
* constructor(ctx: DurableObjectState, env: Env) {
|
|
100
|
+
* this.coldStartManager = createColdStartManager({
|
|
101
|
+
* databaseId: ctx.id.toString(),
|
|
102
|
+
* wasmModule: pgliteWasm,
|
|
103
|
+
* doStorage: ctx.storage,
|
|
104
|
+
* r2Bucket: env.R2_BUCKET,
|
|
105
|
+
* prefetchStrategy: 'hot-warm',
|
|
106
|
+
* })
|
|
107
|
+
* }
|
|
108
|
+
*
|
|
109
|
+
* async fetch(request: Request) {
|
|
110
|
+
* // Optimized wake - sub-10ms even from hibernation
|
|
111
|
+
* await this.coldStartManager.ensureReady()
|
|
112
|
+
*
|
|
113
|
+
* // First query triggers lazy PGLite init
|
|
114
|
+
* const result = await this.coldStartManager.query('SELECT * FROM users')
|
|
115
|
+
* return new Response(JSON.stringify(result.rows))
|
|
116
|
+
* }
|
|
117
|
+
*
|
|
118
|
+
* async alarm() {
|
|
119
|
+
* // Persist state before hibernation
|
|
120
|
+
* await this.coldStartManager.prepareHibernation()
|
|
121
|
+
* }
|
|
122
|
+
* }
|
|
123
|
+
* ```
|
|
124
|
+
*
|
|
125
|
+
* @module pglite/cold-start-manager
|
|
126
|
+
* @see {@link ColdStartOptimizer} for low-level optimization
|
|
127
|
+
* @see {@link TieredVFS} for storage tier details
|
|
128
|
+
* @issue postgres-m9rp
|
|
129
|
+
*/
|
|
130
|
+
|
|
131
|
+
import type { PGlite, PGliteOptions } from '@dotdo/pglite'
|
|
132
|
+
import type { CacheLayer } from './cache-layer'
|
|
133
|
+
import type { R2StorageLayer } from './r2-layer'
|
|
134
|
+
import type {
|
|
135
|
+
ColdStartOptimizer,
|
|
136
|
+
ColdStartConfig,
|
|
137
|
+
ColdStartMetrics,
|
|
138
|
+
ColdStartPhase,
|
|
139
|
+
} from './cold-start-optimizer'
|
|
140
|
+
import { createColdStartOptimizer, clearWasmCache, getWasmCacheStats } from './cold-start-optimizer'
|
|
141
|
+
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// Types
|
|
144
|
+
// ============================================================================
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Hibernation state persisted to DO storage for quick recovery
|
|
148
|
+
*
|
|
149
|
+
* This state is saved when the DO hibernates and restored on wake,
|
|
150
|
+
* allowing sub-10ms recovery without full PGLite reinitialization.
|
|
151
|
+
*
|
|
152
|
+
* ## Persisted Data
|
|
153
|
+
*
|
|
154
|
+
* - Database metadata (ID, size, data source)
|
|
155
|
+
* - Cumulative performance metrics
|
|
156
|
+
* - Hot page list for prefetch optimization
|
|
157
|
+
* - Schema checksum for validation
|
|
158
|
+
*
|
|
159
|
+
* ## Storage Keys
|
|
160
|
+
*
|
|
161
|
+
* State is stored in DO SQLite using configurable key prefix:
|
|
162
|
+
* - `{prefix}hibernate_state` - Main hibernation state
|
|
163
|
+
* - `{prefix}hot_pages` - List of frequently accessed pages
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* // Prepare hibernation before DO sleeps
|
|
168
|
+
* const state = await manager.prepareHibernation()
|
|
169
|
+
* console.log(`Hibernating with ${state.hotPages.length} hot pages`)
|
|
170
|
+
*
|
|
171
|
+
* // Wake from hibernation (in new isolate)
|
|
172
|
+
* const result = await manager.wakeFromHibernation(state)
|
|
173
|
+
* console.log(`Woke in ${result.wakeTimeMs}ms`)
|
|
174
|
+
* ```
|
|
175
|
+
*/
|
|
176
|
+
export interface ColdStartHibernateState {
|
|
177
|
+
/** Database ID for cache keying */
|
|
178
|
+
databaseId: string
|
|
179
|
+
/** Last known data size in bytes */
|
|
180
|
+
lastDataSizeBytes: number
|
|
181
|
+
/** Last data source used */
|
|
182
|
+
lastDataSource: 'hot' | 'warm' | 'cold' | 'empty'
|
|
183
|
+
/** Timestamp of last initialization */
|
|
184
|
+
lastInitAt: number
|
|
185
|
+
/** Cumulative metrics from previous sessions */
|
|
186
|
+
cumulativeMetrics: {
|
|
187
|
+
totalInits: number
|
|
188
|
+
coldStarts: number
|
|
189
|
+
warmStarts: number
|
|
190
|
+
hibernationWakes: number
|
|
191
|
+
avgColdStartMs: number
|
|
192
|
+
avgWarmStartMs: number
|
|
193
|
+
avgWakeMs: number
|
|
194
|
+
}
|
|
195
|
+
/** Frequently accessed pages for prefetch */
|
|
196
|
+
hotPages: string[]
|
|
197
|
+
/** Schema checksum for validation */
|
|
198
|
+
schemaChecksum?: string
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Result from waking up after hibernation
|
|
203
|
+
*
|
|
204
|
+
* Contains timing information and status of the wake process.
|
|
205
|
+
* Use this to monitor hibernation recovery performance.
|
|
206
|
+
*
|
|
207
|
+
* ## Wake Types
|
|
208
|
+
*
|
|
209
|
+
* - **Quick wake** (`isQuickWake: true`): State restored without PGLite init,
|
|
210
|
+
* typically < 10ms. First query will trigger lazy initialization.
|
|
211
|
+
*
|
|
212
|
+
* - **Full wake** (`isQuickWake: false`): Full PGLite reinitialization,
|
|
213
|
+
* typically 500-1500ms. Used when cached instance is invalid.
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* ```typescript
|
|
217
|
+
* const result = await manager.wakeFromHibernation()
|
|
218
|
+
*
|
|
219
|
+
* if (result.isQuickWake) {
|
|
220
|
+
* console.log(`Quick wake: ${result.wakeTimeMs}ms`)
|
|
221
|
+
* } else {
|
|
222
|
+
* console.log(`Full wake: ${result.wakeTimeMs}ms`)
|
|
223
|
+
* console.log(`PGLite init: ${result.metrics?.pgliteInitMs}ms`)
|
|
224
|
+
* }
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
export interface ColdStartWakeResult {
|
|
228
|
+
/** Time to wake in milliseconds */
|
|
229
|
+
wakeTimeMs: number
|
|
230
|
+
/** Whether hot pages were restored */
|
|
231
|
+
hotPagesRestored: boolean
|
|
232
|
+
/** Number of pages prefetched */
|
|
233
|
+
pagesPrefetched: number
|
|
234
|
+
/** Whether this was a full cold start or quick wake */
|
|
235
|
+
isQuickWake: boolean
|
|
236
|
+
/** Underlying cold start metrics */
|
|
237
|
+
metrics: ColdStartMetrics | null
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Prefetch strategy for storage tier warming
|
|
242
|
+
*
|
|
243
|
+
* Controls how aggressively the manager prefetches data during initialization.
|
|
244
|
+
* Choose based on your latency vs memory trade-offs:
|
|
245
|
+
*
|
|
246
|
+
* | Strategy | Behavior | Use Case |
|
|
247
|
+
* |----------|----------|----------|
|
|
248
|
+
* | `none` | No prefetching | Memory-constrained, simple workloads |
|
|
249
|
+
* | `hot-only` | Only HOT tier | Low-memory, frequently accessed data |
|
|
250
|
+
* | `hot-warm` | HOT + WARM tiers | **Recommended** - balanced approach |
|
|
251
|
+
* | `aggressive` | All tiers parallel | Latency-critical, memory available |
|
|
252
|
+
*
|
|
253
|
+
* @default 'hot-warm'
|
|
254
|
+
*/
|
|
255
|
+
export type PrefetchStrategy = 'none' | 'hot-only' | 'hot-warm' | 'aggressive'
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Configuration for ColdStartManager
|
|
259
|
+
*
|
|
260
|
+
* Extends ColdStartConfig with DO-specific options for hibernation
|
|
261
|
+
* state management and lifecycle integration.
|
|
262
|
+
*
|
|
263
|
+
* ## Required Options
|
|
264
|
+
*
|
|
265
|
+
* - `databaseId`: Unique identifier for caching and state persistence
|
|
266
|
+
* - `wasmModule`: Pre-compiled WASM module (from ColdStartConfig)
|
|
267
|
+
*
|
|
268
|
+
* ## Recommended Options
|
|
269
|
+
*
|
|
270
|
+
* - `doStorage`: DO SQLite for hibernation state persistence
|
|
271
|
+
* - `prefetchStrategy`: 'hot-warm' for balanced performance
|
|
272
|
+
* - `speculativePrefetch`: true for optimal cold start times
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* ```typescript
|
|
276
|
+
* const config: ColdStartManagerConfig = {
|
|
277
|
+
* // Required
|
|
278
|
+
* databaseId: ctx.id.toString(),
|
|
279
|
+
* wasmModule: pgliteWasm,
|
|
280
|
+
*
|
|
281
|
+
* // DO integration
|
|
282
|
+
* doStorage: ctx.storage,
|
|
283
|
+
* persistHibernationState: true,
|
|
284
|
+
*
|
|
285
|
+
* // Storage tiers
|
|
286
|
+
* cacheLayer: myCacheLayer,
|
|
287
|
+
* warmCacheKey: `db:${databaseId}`,
|
|
288
|
+
* r2Bucket: env.R2_BUCKET,
|
|
289
|
+
* coldStorageKey: `databases/${databaseId}/data.tar`,
|
|
290
|
+
*
|
|
291
|
+
* // Optimization
|
|
292
|
+
* prefetchStrategy: 'hot-warm',
|
|
293
|
+
* speculativePrefetch: true,
|
|
294
|
+
*
|
|
295
|
+
* // Callbacks
|
|
296
|
+
* onWake: (result) => {
|
|
297
|
+
* analytics.track('do_wake', { wakeTimeMs: result.wakeTimeMs })
|
|
298
|
+
* },
|
|
299
|
+
* }
|
|
300
|
+
* ```
|
|
301
|
+
*/
|
|
302
|
+
export interface ColdStartManagerConfig extends ColdStartConfig {
|
|
303
|
+
/**
|
|
304
|
+
* Database identifier for caching and prefetch
|
|
305
|
+
*/
|
|
306
|
+
databaseId: string
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Durable Object storage for hibernation state
|
|
310
|
+
*/
|
|
311
|
+
doStorage?: DurableObjectStorage
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Prefetch strategy for storage tier warming
|
|
315
|
+
* - none: No prefetching
|
|
316
|
+
* - hot-only: Only prefetch hot tier data
|
|
317
|
+
* - hot-warm: Prefetch hot and warm tier data
|
|
318
|
+
* - aggressive: Prefetch all tiers in parallel
|
|
319
|
+
* Default: 'hot-warm'
|
|
320
|
+
*/
|
|
321
|
+
prefetchStrategy?: PrefetchStrategy
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Maximum number of hot pages to track for prefetch
|
|
325
|
+
* Default: 100
|
|
326
|
+
*/
|
|
327
|
+
maxHotPages?: number
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Enable hibernation state persistence
|
|
331
|
+
* Default: true
|
|
332
|
+
*/
|
|
333
|
+
persistHibernationState?: boolean
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Key prefix for hibernation state in DO storage
|
|
337
|
+
* Default: '__cold_start_'
|
|
338
|
+
*/
|
|
339
|
+
hibernationKeyPrefix?: string
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Time in milliseconds to consider instance "warm" for reuse
|
|
343
|
+
* Default: 30000 (30 seconds)
|
|
344
|
+
*/
|
|
345
|
+
warmInstanceTtlMs?: number
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Enable speculative prefetch during initialization
|
|
349
|
+
* Fetches likely-needed pages while PGLite initializes
|
|
350
|
+
* Default: true
|
|
351
|
+
*/
|
|
352
|
+
speculativePrefetch?: boolean
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Callback for hibernation state changes
|
|
356
|
+
*/
|
|
357
|
+
onHibernate?: (state: ColdStartHibernateState) => void
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Callback for wake completion
|
|
361
|
+
*/
|
|
362
|
+
onWake?: (result: ColdStartWakeResult) => void
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Manager lifecycle status
|
|
367
|
+
*
|
|
368
|
+
* Tracks the current state of the ColdStartManager:
|
|
369
|
+
*
|
|
370
|
+
* ```
|
|
371
|
+
* not_started → initializing → ready → hibernating
|
|
372
|
+
* ↑ ↓ ↑ ↓
|
|
373
|
+
* └── error ←────┘ └── waking ┘
|
|
374
|
+
* ```
|
|
375
|
+
*
|
|
376
|
+
* - `not_started`: Manager created but not initialized
|
|
377
|
+
* - `initializing`: Cold start in progress
|
|
378
|
+
* - `ready`: Ready for queries (PGLite may still be lazy)
|
|
379
|
+
* - `hibernating`: Preparing hibernation state
|
|
380
|
+
* - `waking`: Recovering from hibernation
|
|
381
|
+
* - `error`: Initialization or operation failed
|
|
382
|
+
*/
|
|
383
|
+
export type ManagerStatus =
|
|
384
|
+
| 'not_started'
|
|
385
|
+
| 'initializing'
|
|
386
|
+
| 'ready'
|
|
387
|
+
| 'hibernating'
|
|
388
|
+
| 'waking'
|
|
389
|
+
| 'error'
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Comprehensive manager statistics
|
|
393
|
+
*
|
|
394
|
+
* Provides visibility into cold start performance, caching effectiveness,
|
|
395
|
+
* and prefetch behavior across the manager's lifetime.
|
|
396
|
+
*
|
|
397
|
+
* ## Key Metrics
|
|
398
|
+
*
|
|
399
|
+
* - `cumulativeMetrics`: Aggregated stats across all initializations
|
|
400
|
+
* - `wasmCacheStats`: WASM cache hit/miss information
|
|
401
|
+
* - `prefetchStats`: Prefetch effectiveness tracking
|
|
402
|
+
*
|
|
403
|
+
* @example
|
|
404
|
+
* ```typescript
|
|
405
|
+
* const stats = manager.getStats()
|
|
406
|
+
*
|
|
407
|
+
* console.log(`Status: ${stats.status}`)
|
|
408
|
+
* console.log(`Total inits: ${stats.cumulativeMetrics.totalInits}`)
|
|
409
|
+
* console.log(`Cold starts: ${stats.cumulativeMetrics.coldStarts}`)
|
|
410
|
+
* console.log(`Warm starts: ${stats.cumulativeMetrics.warmStarts}`)
|
|
411
|
+
* console.log(`Avg cold start: ${stats.cumulativeMetrics.avgColdStartMs}ms`)
|
|
412
|
+
* console.log(`Hot pages tracked: ${stats.prefetchStats.hotPagesTracked}`)
|
|
413
|
+
* ```
|
|
414
|
+
*/
|
|
415
|
+
export interface ColdStartManagerStats {
|
|
416
|
+
status: ManagerStatus
|
|
417
|
+
currentMetrics: ColdStartMetrics | null
|
|
418
|
+
cumulativeMetrics: ColdStartHibernateState['cumulativeMetrics']
|
|
419
|
+
wasmCacheStats: ReturnType<typeof getWasmCacheStats>
|
|
420
|
+
prefetchStats: {
|
|
421
|
+
hotPagesTracked: number
|
|
422
|
+
prefetchesTriggered: number
|
|
423
|
+
prefetchHits: number
|
|
424
|
+
prefetchMisses: number
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// ============================================================================
|
|
429
|
+
// Storage Key Constants
|
|
430
|
+
// ============================================================================
|
|
431
|
+
|
|
432
|
+
const HIBERNATE_STATE_KEY = 'hibernate_state'
|
|
433
|
+
const HOT_PAGES_KEY = 'hot_pages'
|
|
434
|
+
|
|
435
|
+
// ============================================================================
|
|
436
|
+
// ColdStartManager Implementation
|
|
437
|
+
// ============================================================================
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Cold Start Manager for Durable Object lifecycle integration
|
|
441
|
+
*
|
|
442
|
+
* Provides optimized cold start handling with:
|
|
443
|
+
* - Lazy initialization with parallel data fetch
|
|
444
|
+
* - Hibernation state persistence and quick wake
|
|
445
|
+
* - Hot page tracking for intelligent prefetch
|
|
446
|
+
* - Cumulative metrics across sessions
|
|
447
|
+
*
|
|
448
|
+
* @example
|
|
449
|
+
* ```typescript
|
|
450
|
+
* // In DO constructor
|
|
451
|
+
* this.coldStartManager = createColdStartManager({
|
|
452
|
+
* databaseId: this.ctx.id.toString(),
|
|
453
|
+
* wasmModule: pgliteWasm,
|
|
454
|
+
* doStorage: this.ctx.storage,
|
|
455
|
+
* r2Bucket: env.R2_BUCKET,
|
|
456
|
+
* prefetchStrategy: 'hot-warm',
|
|
457
|
+
* })
|
|
458
|
+
*
|
|
459
|
+
* // In DO fetch handler
|
|
460
|
+
* async fetch(request: Request) {
|
|
461
|
+
* await this.coldStartManager.ensureReady()
|
|
462
|
+
* const pglite = await this.coldStartManager.getInstance()
|
|
463
|
+
* // ... execute query
|
|
464
|
+
* }
|
|
465
|
+
*
|
|
466
|
+
* // In DO alarm handler (hibernation)
|
|
467
|
+
* async alarm() {
|
|
468
|
+
* await this.coldStartManager.prepareHibernation()
|
|
469
|
+
* }
|
|
470
|
+
* ```
|
|
471
|
+
*/
|
|
472
|
+
export class ColdStartManager {
|
|
473
|
+
private config: Required<
|
|
474
|
+
Pick<
|
|
475
|
+
ColdStartManagerConfig,
|
|
476
|
+
| 'databaseId'
|
|
477
|
+
| 'prefetchStrategy'
|
|
478
|
+
| 'maxHotPages'
|
|
479
|
+
| 'persistHibernationState'
|
|
480
|
+
| 'hibernationKeyPrefix'
|
|
481
|
+
| 'warmInstanceTtlMs'
|
|
482
|
+
| 'speculativePrefetch'
|
|
483
|
+
>
|
|
484
|
+
> & ColdStartManagerConfig
|
|
485
|
+
|
|
486
|
+
private optimizer: ColdStartOptimizer | null = null
|
|
487
|
+
private status: ManagerStatus = 'not_started'
|
|
488
|
+
private hibernateState: ColdStartHibernateState | null = null
|
|
489
|
+
private hotPages: Set<string> = new Set()
|
|
490
|
+
private lastAccessTime: number = 0
|
|
491
|
+
private initPromise: Promise<void> | null = null
|
|
492
|
+
private wakePromise: Promise<ColdStartWakeResult> | null = null
|
|
493
|
+
|
|
494
|
+
// Prefetch statistics
|
|
495
|
+
private prefetchStats = {
|
|
496
|
+
prefetchesTriggered: 0,
|
|
497
|
+
prefetchHits: 0,
|
|
498
|
+
prefetchMisses: 0,
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Cumulative metrics (persisted across hibernations)
|
|
502
|
+
private cumulativeMetrics: ColdStartHibernateState['cumulativeMetrics'] = {
|
|
503
|
+
totalInits: 0,
|
|
504
|
+
coldStarts: 0,
|
|
505
|
+
warmStarts: 0,
|
|
506
|
+
hibernationWakes: 0,
|
|
507
|
+
avgColdStartMs: 0,
|
|
508
|
+
avgWarmStartMs: 0,
|
|
509
|
+
avgWakeMs: 0,
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
constructor(config: ColdStartManagerConfig) {
|
|
513
|
+
this.config = {
|
|
514
|
+
...config,
|
|
515
|
+
databaseId: config.databaseId,
|
|
516
|
+
prefetchStrategy: config.prefetchStrategy ?? 'hot-warm',
|
|
517
|
+
maxHotPages: config.maxHotPages ?? 100,
|
|
518
|
+
persistHibernationState: config.persistHibernationState ?? true,
|
|
519
|
+
hibernationKeyPrefix: config.hibernationKeyPrefix ?? '__cold_start_',
|
|
520
|
+
warmInstanceTtlMs: config.warmInstanceTtlMs ?? 30000,
|
|
521
|
+
speculativePrefetch: config.speculativePrefetch ?? true,
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// ==========================================================================
|
|
526
|
+
// Public API
|
|
527
|
+
// ==========================================================================
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Get the current manager status
|
|
531
|
+
*/
|
|
532
|
+
getStatus(): ManagerStatus {
|
|
533
|
+
return this.status
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* Check if the manager is ready
|
|
538
|
+
* Returns true after optimized wake even if PGLite is not yet initialized
|
|
539
|
+
*/
|
|
540
|
+
isReady(): boolean {
|
|
541
|
+
// After optimized wake, status is 'ready' but optimizer may be null
|
|
542
|
+
return this.status === 'ready'
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* Check if PGLite optimizer is fully initialized
|
|
547
|
+
*/
|
|
548
|
+
isPGLiteReady(): boolean {
|
|
549
|
+
return this.status === 'ready' && this.optimizer?.isReady() === true
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* Ensure the manager is ready for queries
|
|
554
|
+
* After wakeFromHibernation(), ensureReady() is a no-op (< 1ms)
|
|
555
|
+
*/
|
|
556
|
+
async ensureReady(): Promise<void> {
|
|
557
|
+
// Fast path: already ready (including after optimized wake)
|
|
558
|
+
if (this.status === 'ready') {
|
|
559
|
+
this.lastAccessTime = Date.now()
|
|
560
|
+
return
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// Check if we have pre-loaded hibernation state that just needs state restoration
|
|
564
|
+
if (this.status === 'not_started' && this.config.persistHibernationState && this.config.doStorage) {
|
|
565
|
+
const loaded = await this.tryLoadAndRestoreState()
|
|
566
|
+
if (loaded) {
|
|
567
|
+
return
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// Check if we can do a quick wake (optimizer still valid within TTL)
|
|
572
|
+
if (this.hibernateState && this.canQuickWake()) {
|
|
573
|
+
await this.quickWake()
|
|
574
|
+
return
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// Full initialization required
|
|
578
|
+
if (!this.initPromise) {
|
|
579
|
+
this.initPromise = this.initialize()
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
await this.initPromise
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* Try to load and restore state from DO storage without full initialization
|
|
587
|
+
*/
|
|
588
|
+
private async tryLoadAndRestoreState(): Promise<boolean> {
|
|
589
|
+
try {
|
|
590
|
+
const stateKey = this.config.hibernationKeyPrefix + HIBERNATE_STATE_KEY
|
|
591
|
+
const pagesKey = this.config.hibernationKeyPrefix + HOT_PAGES_KEY
|
|
592
|
+
|
|
593
|
+
const [state, pages] = await Promise.all([
|
|
594
|
+
this.config.doStorage!.get<ColdStartHibernateState>(stateKey),
|
|
595
|
+
this.config.doStorage!.get<string[]>(pagesKey),
|
|
596
|
+
])
|
|
597
|
+
|
|
598
|
+
if (state) {
|
|
599
|
+
this.hibernateState = state
|
|
600
|
+
this.cumulativeMetrics = state.cumulativeMetrics
|
|
601
|
+
|
|
602
|
+
if (pages) {
|
|
603
|
+
this.hotPages = new Set(pages)
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
this.status = 'ready'
|
|
607
|
+
this.lastAccessTime = Date.now()
|
|
608
|
+
this.cumulativeMetrics.hibernationWakes++
|
|
609
|
+
this.cumulativeMetrics.totalInits++
|
|
610
|
+
|
|
611
|
+
return true
|
|
612
|
+
}
|
|
613
|
+
} catch {
|
|
614
|
+
// Ignore errors - will fall back to full initialization
|
|
615
|
+
}
|
|
616
|
+
return false
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/**
|
|
620
|
+
* Get the PGLite instance (initializes if needed)
|
|
621
|
+
* After optimized wake, this lazily creates the PGLite instance
|
|
622
|
+
*/
|
|
623
|
+
async getInstance(): Promise<PGlite> {
|
|
624
|
+
await this.ensureReady()
|
|
625
|
+
await this.ensurePGLiteInitialized()
|
|
626
|
+
return this.optimizer!.getInstance()
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
/**
|
|
630
|
+
* Execute a query (auto-initializes if needed)
|
|
631
|
+
* After optimized wake, the first query triggers lazy PGLite initialization
|
|
632
|
+
*/
|
|
633
|
+
async query<T = unknown>(sql: string, params?: unknown[]): Promise<{ rows: T[] }> {
|
|
634
|
+
await this.ensureReady()
|
|
635
|
+
await this.ensurePGLiteInitialized()
|
|
636
|
+
|
|
637
|
+
// Track hot page access (simple heuristic based on table access)
|
|
638
|
+
this.trackPageAccess(sql)
|
|
639
|
+
|
|
640
|
+
return this.optimizer!.query<T>(sql, params)
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* Ensure PGLite optimizer is initialized
|
|
645
|
+
* Called lazily on first query after optimized wake
|
|
646
|
+
*/
|
|
647
|
+
private async ensurePGLiteInitialized(): Promise<void> {
|
|
648
|
+
if (this.optimizer?.isReady()) {
|
|
649
|
+
return
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
// Create optimizer lazily
|
|
653
|
+
if (!this.optimizer) {
|
|
654
|
+
this.optimizer = createColdStartOptimizer({
|
|
655
|
+
...this.config,
|
|
656
|
+
database: this.config.databaseId,
|
|
657
|
+
onReady: (metrics) => {
|
|
658
|
+
this.updateCumulativeMetrics(metrics)
|
|
659
|
+
this.config.onReady?.(metrics)
|
|
660
|
+
},
|
|
661
|
+
onPhaseChange: this.config.onPhaseChange,
|
|
662
|
+
onError: this.config.onError,
|
|
663
|
+
})
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
await this.optimizer.initialize()
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/**
|
|
670
|
+
* Get current metrics
|
|
671
|
+
*/
|
|
672
|
+
getMetrics(): ColdStartMetrics | null {
|
|
673
|
+
return this.optimizer?.getMetrics() ?? null
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/**
|
|
677
|
+
* Get comprehensive manager statistics
|
|
678
|
+
*/
|
|
679
|
+
getStats(): ColdStartManagerStats {
|
|
680
|
+
return {
|
|
681
|
+
status: this.status,
|
|
682
|
+
currentMetrics: this.optimizer?.getMetrics() ?? null,
|
|
683
|
+
cumulativeMetrics: { ...this.cumulativeMetrics },
|
|
684
|
+
wasmCacheStats: getWasmCacheStats(),
|
|
685
|
+
prefetchStats: {
|
|
686
|
+
hotPagesTracked: this.hotPages.size,
|
|
687
|
+
...this.prefetchStats,
|
|
688
|
+
},
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/**
|
|
693
|
+
* Prepare for hibernation by persisting state to DO storage
|
|
694
|
+
*
|
|
695
|
+
* Call this before the DO hibernates (e.g., in an alarm handler or after
|
|
696
|
+
* detecting inactivity) to ensure quick recovery on the next wake.
|
|
697
|
+
*
|
|
698
|
+
* ## What Gets Persisted
|
|
699
|
+
*
|
|
700
|
+
* - Database ID and metadata
|
|
701
|
+
* - Cumulative performance metrics
|
|
702
|
+
* - Hot page list (for prefetch optimization)
|
|
703
|
+
* - Last known data source and size
|
|
704
|
+
*
|
|
705
|
+
* ## Usage
|
|
706
|
+
*
|
|
707
|
+
* ```typescript
|
|
708
|
+
* // In DO alarm handler
|
|
709
|
+
* async alarm() {
|
|
710
|
+
* const state = await this.manager.prepareHibernation()
|
|
711
|
+
* console.log(`Hibernating with ${state.hotPages.length} hot pages`)
|
|
712
|
+
* }
|
|
713
|
+
* ```
|
|
714
|
+
*
|
|
715
|
+
* @returns The hibernation state that was persisted
|
|
716
|
+
*/
|
|
717
|
+
async prepareHibernation(): Promise<ColdStartHibernateState> {
|
|
718
|
+
this.status = 'hibernating'
|
|
719
|
+
|
|
720
|
+
const metrics = this.optimizer?.getMetrics()
|
|
721
|
+
const state: ColdStartHibernateState = {
|
|
722
|
+
databaseId: this.config.databaseId,
|
|
723
|
+
lastDataSizeBytes: metrics?.dataSizeBytes ?? 0,
|
|
724
|
+
lastDataSource: metrics?.dataSource ?? 'empty',
|
|
725
|
+
lastInitAt: Date.now(),
|
|
726
|
+
cumulativeMetrics: { ...this.cumulativeMetrics },
|
|
727
|
+
hotPages: Array.from(this.hotPages).slice(0, this.config.maxHotPages),
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// Persist hibernation state
|
|
731
|
+
if (this.config.persistHibernationState && this.config.doStorage) {
|
|
732
|
+
const stateKey = this.config.hibernationKeyPrefix + HIBERNATE_STATE_KEY
|
|
733
|
+
const pagesKey = this.config.hibernationKeyPrefix + HOT_PAGES_KEY
|
|
734
|
+
|
|
735
|
+
await this.config.doStorage.put(stateKey, state)
|
|
736
|
+
await this.config.doStorage.put(pagesKey, Array.from(this.hotPages))
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
this.hibernateState = state
|
|
740
|
+
this.config.onHibernate?.(state)
|
|
741
|
+
|
|
742
|
+
return state
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* Wake from hibernation with optimized state restoration
|
|
747
|
+
*
|
|
748
|
+
* This method provides sub-10ms wake times by only restoring state metadata.
|
|
749
|
+
* PGLite initialization is deferred until the first actual query.
|
|
750
|
+
*
|
|
751
|
+
* ## How It Works
|
|
752
|
+
*
|
|
753
|
+
* 1. Loads hibernation state from DO storage (if not provided)
|
|
754
|
+
* 2. Restores hot page tracking and cumulative metrics
|
|
755
|
+
* 3. Sets status to 'ready' immediately
|
|
756
|
+
* 4. First query triggers lazy PGLite initialization
|
|
757
|
+
*
|
|
758
|
+
* ## Performance
|
|
759
|
+
*
|
|
760
|
+
* | Scenario | Time | Notes |
|
|
761
|
+
* |----------|------|-------|
|
|
762
|
+
* | Optimized wake | < 10ms | State restoration only |
|
|
763
|
+
* | First query | 500-1500ms | PGLite init + query |
|
|
764
|
+
* | Subsequent queries | < 50ms | Warm PGLite instance |
|
|
765
|
+
*
|
|
766
|
+
* ## Usage
|
|
767
|
+
*
|
|
768
|
+
* ```typescript
|
|
769
|
+
* async fetch(request: Request) {
|
|
770
|
+
* // Optimized wake - sub-10ms
|
|
771
|
+
* const result = await this.manager.wakeFromHibernation()
|
|
772
|
+
* console.log(`Woke in ${result.wakeTimeMs}ms`)
|
|
773
|
+
*
|
|
774
|
+
* // First query triggers PGLite init
|
|
775
|
+
* const users = await this.manager.query('SELECT * FROM users')
|
|
776
|
+
* return new Response(JSON.stringify(users.rows))
|
|
777
|
+
* }
|
|
778
|
+
* ```
|
|
779
|
+
*
|
|
780
|
+
* @param state - Optional pre-loaded hibernation state (skips storage read)
|
|
781
|
+
* @returns Wake result with timing and status information
|
|
782
|
+
*/
|
|
783
|
+
async wakeFromHibernation(
|
|
784
|
+
state?: ColdStartHibernateState
|
|
785
|
+
): Promise<ColdStartWakeResult> {
|
|
786
|
+
if (this.wakePromise) {
|
|
787
|
+
return this.wakePromise
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
this.status = 'waking'
|
|
791
|
+
// Use optimized wake that restores state without reinitializing PGLite
|
|
792
|
+
this.wakePromise = this.performOptimizedWake(state)
|
|
793
|
+
|
|
794
|
+
try {
|
|
795
|
+
return await this.wakePromise
|
|
796
|
+
} finally {
|
|
797
|
+
this.wakePromise = null
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
/**
|
|
802
|
+
* Close the manager and release all resources
|
|
803
|
+
*
|
|
804
|
+
* This method:
|
|
805
|
+
* - Closes the underlying PGLite instance
|
|
806
|
+
* - Removes from WASM cache
|
|
807
|
+
* - Resets status to 'not_started'
|
|
808
|
+
*
|
|
809
|
+
* Call this when the DO is being destroyed or the database is no longer needed.
|
|
810
|
+
*
|
|
811
|
+
* @example
|
|
812
|
+
* ```typescript
|
|
813
|
+
* // Clean shutdown
|
|
814
|
+
* await manager.prepareHibernation()
|
|
815
|
+
* await manager.close()
|
|
816
|
+
* ```
|
|
817
|
+
*/
|
|
818
|
+
async close(): Promise<void> {
|
|
819
|
+
if (this.optimizer) {
|
|
820
|
+
await this.optimizer.close()
|
|
821
|
+
this.optimizer = null
|
|
822
|
+
}
|
|
823
|
+
this.status = 'not_started'
|
|
824
|
+
this.initPromise = null
|
|
825
|
+
this.wakePromise = null
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
/**
|
|
829
|
+
* Clear all caches
|
|
830
|
+
*
|
|
831
|
+
* Clears WASM cache, hot page tracking, and hibernation state.
|
|
832
|
+
* Primarily useful for testing to ensure clean state between tests.
|
|
833
|
+
*
|
|
834
|
+
* @example
|
|
835
|
+
* ```typescript
|
|
836
|
+
* // In tests
|
|
837
|
+
* beforeEach(() => {
|
|
838
|
+
* manager.clearCaches()
|
|
839
|
+
* })
|
|
840
|
+
* ```
|
|
841
|
+
*/
|
|
842
|
+
clearCaches(): void {
|
|
843
|
+
clearWasmCache()
|
|
844
|
+
this.hotPages.clear()
|
|
845
|
+
this.hibernateState = null
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
// ==========================================================================
|
|
849
|
+
// Private Methods
|
|
850
|
+
// ==========================================================================
|
|
851
|
+
|
|
852
|
+
/**
|
|
853
|
+
* Full cold start initialization
|
|
854
|
+
*/
|
|
855
|
+
private async initialize(): Promise<void> {
|
|
856
|
+
const startTime = performance.now()
|
|
857
|
+
this.status = 'initializing'
|
|
858
|
+
|
|
859
|
+
try {
|
|
860
|
+
// Load persisted hibernation state
|
|
861
|
+
await this.loadHibernationState()
|
|
862
|
+
|
|
863
|
+
// Start speculative prefetch in parallel with optimizer creation
|
|
864
|
+
let prefetchPromise: Promise<void> | null = null
|
|
865
|
+
if (
|
|
866
|
+
this.config.speculativePrefetch &&
|
|
867
|
+
this.hibernateState?.hotPages?.length
|
|
868
|
+
) {
|
|
869
|
+
prefetchPromise = this.prefetchHotPages()
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// Create and initialize the optimizer
|
|
873
|
+
this.optimizer = createColdStartOptimizer({
|
|
874
|
+
...this.config,
|
|
875
|
+
database: this.config.databaseId,
|
|
876
|
+
onReady: (metrics) => {
|
|
877
|
+
this.updateCumulativeMetrics(metrics)
|
|
878
|
+
this.config.onReady?.(metrics)
|
|
879
|
+
},
|
|
880
|
+
onPhaseChange: this.config.onPhaseChange,
|
|
881
|
+
onError: this.config.onError,
|
|
882
|
+
})
|
|
883
|
+
|
|
884
|
+
await this.optimizer.initialize()
|
|
885
|
+
|
|
886
|
+
// Wait for prefetch to complete (if started)
|
|
887
|
+
if (prefetchPromise) {
|
|
888
|
+
await prefetchPromise.catch(() => {
|
|
889
|
+
// Ignore prefetch errors - not critical
|
|
890
|
+
})
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
this.status = 'ready'
|
|
894
|
+
this.lastAccessTime = Date.now()
|
|
895
|
+
|
|
896
|
+
// Track timing
|
|
897
|
+
const totalMs = performance.now() - startTime
|
|
898
|
+
const metrics = this.optimizer.getMetrics()
|
|
899
|
+
if (metrics) {
|
|
900
|
+
this.logDebug(
|
|
901
|
+
`Cold start complete: ${totalMs.toFixed(2)}ms ` +
|
|
902
|
+
`(isWarm: ${metrics.isWarmStart}, source: ${metrics.dataSource})`
|
|
903
|
+
)
|
|
904
|
+
}
|
|
905
|
+
} catch (error) {
|
|
906
|
+
this.status = 'error'
|
|
907
|
+
throw error
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
/**
|
|
912
|
+
* Quick wake from hibernation (when instance is still warm)
|
|
913
|
+
*/
|
|
914
|
+
private async quickWake(): Promise<void> {
|
|
915
|
+
const startTime = performance.now()
|
|
916
|
+
this.status = 'waking'
|
|
917
|
+
|
|
918
|
+
// For quick wake, we just verify the optimizer is still valid
|
|
919
|
+
if (this.optimizer?.isReady()) {
|
|
920
|
+
const wakeTimeMs = performance.now() - startTime
|
|
921
|
+
|
|
922
|
+
// Update cumulative metrics
|
|
923
|
+
this.cumulativeMetrics.hibernationWakes++
|
|
924
|
+
this.cumulativeMetrics.avgWakeMs = this.updateRunningAverage(
|
|
925
|
+
this.cumulativeMetrics.avgWakeMs,
|
|
926
|
+
wakeTimeMs,
|
|
927
|
+
this.cumulativeMetrics.hibernationWakes
|
|
928
|
+
)
|
|
929
|
+
|
|
930
|
+
this.status = 'ready'
|
|
931
|
+
this.lastAccessTime = Date.now()
|
|
932
|
+
|
|
933
|
+
const result: ColdStartWakeResult = {
|
|
934
|
+
wakeTimeMs,
|
|
935
|
+
hotPagesRestored: false,
|
|
936
|
+
pagesPrefetched: 0,
|
|
937
|
+
isQuickWake: true,
|
|
938
|
+
metrics: this.optimizer.getMetrics(),
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
this.config.onWake?.(result)
|
|
942
|
+
return
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
// Fall back to full wake
|
|
946
|
+
await this.performWake()
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
/**
|
|
950
|
+
* Optimized wake that only restores state metadata
|
|
951
|
+
* PGLite initialization is deferred to first query for < 10ms wake time
|
|
952
|
+
*/
|
|
953
|
+
private async performOptimizedWake(
|
|
954
|
+
state?: ColdStartHibernateState
|
|
955
|
+
): Promise<ColdStartWakeResult> {
|
|
956
|
+
const startTime = performance.now()
|
|
957
|
+
|
|
958
|
+
// Load state if not provided
|
|
959
|
+
const hibernateState = state ?? this.hibernateState
|
|
960
|
+
if (!hibernateState && !state) {
|
|
961
|
+
await this.loadHibernationState()
|
|
962
|
+
}
|
|
963
|
+
const finalState = state ?? this.hibernateState
|
|
964
|
+
|
|
965
|
+
// Restore hot pages (fast - just Set construction)
|
|
966
|
+
if (finalState?.hotPages) {
|
|
967
|
+
this.hotPages = new Set(finalState.hotPages)
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
// Restore cumulative metrics (fast - object copy)
|
|
971
|
+
if (finalState?.cumulativeMetrics) {
|
|
972
|
+
this.cumulativeMetrics = { ...finalState.cumulativeMetrics }
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
// Store hibernation state for later lazy initialization
|
|
976
|
+
this.hibernateState = finalState ?? null
|
|
977
|
+
|
|
978
|
+
// Mark as ready - PGLite initialization deferred to first query
|
|
979
|
+
this.status = 'ready'
|
|
980
|
+
this.lastAccessTime = Date.now()
|
|
981
|
+
|
|
982
|
+
// Update cumulative metrics for this wake
|
|
983
|
+
this.cumulativeMetrics.hibernationWakes++
|
|
984
|
+
this.cumulativeMetrics.totalInits++
|
|
985
|
+
|
|
986
|
+
const wakeTimeMs = performance.now() - startTime
|
|
987
|
+
|
|
988
|
+
// Update average wake time
|
|
989
|
+
this.cumulativeMetrics.avgWakeMs = this.updateRunningAverage(
|
|
990
|
+
this.cumulativeMetrics.avgWakeMs,
|
|
991
|
+
wakeTimeMs,
|
|
992
|
+
this.cumulativeMetrics.hibernationWakes
|
|
993
|
+
)
|
|
994
|
+
|
|
995
|
+
const result: ColdStartWakeResult = {
|
|
996
|
+
wakeTimeMs,
|
|
997
|
+
hotPagesRestored: this.hotPages.size > 0,
|
|
998
|
+
pagesPrefetched: 0,
|
|
999
|
+
isQuickWake: true, // Optimized wake is always quick
|
|
1000
|
+
metrics: null, // No PGLite metrics yet - deferred initialization
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
this.config.onWake?.(result)
|
|
1004
|
+
return result
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
/**
|
|
1008
|
+
* Perform full wake from hibernation
|
|
1009
|
+
*/
|
|
1010
|
+
private async performWake(
|
|
1011
|
+
state?: ColdStartHibernateState
|
|
1012
|
+
): Promise<ColdStartWakeResult> {
|
|
1013
|
+
const startTime = performance.now()
|
|
1014
|
+
|
|
1015
|
+
// Load state if not provided
|
|
1016
|
+
if (!state && !this.hibernateState) {
|
|
1017
|
+
await this.loadHibernationState()
|
|
1018
|
+
}
|
|
1019
|
+
const hibernateState = state ?? this.hibernateState
|
|
1020
|
+
|
|
1021
|
+
// Restore hot pages
|
|
1022
|
+
if (hibernateState?.hotPages) {
|
|
1023
|
+
this.hotPages = new Set(hibernateState.hotPages)
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
// Restore cumulative metrics
|
|
1027
|
+
if (hibernateState?.cumulativeMetrics) {
|
|
1028
|
+
this.cumulativeMetrics = { ...hibernateState.cumulativeMetrics }
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
// Initialize with hot data if available
|
|
1032
|
+
const hotData = await this.loadHotData()
|
|
1033
|
+
|
|
1034
|
+
this.optimizer = createColdStartOptimizer({
|
|
1035
|
+
...this.config,
|
|
1036
|
+
database: this.config.databaseId,
|
|
1037
|
+
hotData,
|
|
1038
|
+
onReady: (metrics) => {
|
|
1039
|
+
this.updateCumulativeMetrics(metrics)
|
|
1040
|
+
this.config.onReady?.(metrics)
|
|
1041
|
+
},
|
|
1042
|
+
})
|
|
1043
|
+
|
|
1044
|
+
await this.optimizer.initialize()
|
|
1045
|
+
|
|
1046
|
+
// Prefetch hot pages
|
|
1047
|
+
let pagesPrefetched = 0
|
|
1048
|
+
if (this.config.prefetchStrategy !== 'none' && this.hotPages.size > 0) {
|
|
1049
|
+
pagesPrefetched = await this.prefetchHotPages()
|
|
1050
|
+
.then(() => this.hotPages.size)
|
|
1051
|
+
.catch(() => 0)
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
const wakeTimeMs = performance.now() - startTime
|
|
1055
|
+
|
|
1056
|
+
// Update cumulative metrics
|
|
1057
|
+
this.cumulativeMetrics.hibernationWakes++
|
|
1058
|
+
this.cumulativeMetrics.avgWakeMs = this.updateRunningAverage(
|
|
1059
|
+
this.cumulativeMetrics.avgWakeMs,
|
|
1060
|
+
wakeTimeMs,
|
|
1061
|
+
this.cumulativeMetrics.hibernationWakes
|
|
1062
|
+
)
|
|
1063
|
+
|
|
1064
|
+
this.status = 'ready'
|
|
1065
|
+
this.lastAccessTime = Date.now()
|
|
1066
|
+
|
|
1067
|
+
const result: ColdStartWakeResult = {
|
|
1068
|
+
wakeTimeMs,
|
|
1069
|
+
hotPagesRestored: hotData !== undefined,
|
|
1070
|
+
pagesPrefetched,
|
|
1071
|
+
isQuickWake: false,
|
|
1072
|
+
metrics: this.optimizer.getMetrics(),
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
this.config.onWake?.(result)
|
|
1076
|
+
return result
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
/**
|
|
1080
|
+
* Check if we can do a quick wake (instance still warm)
|
|
1081
|
+
*/
|
|
1082
|
+
private canQuickWake(): boolean {
|
|
1083
|
+
if (!this.optimizer) return false
|
|
1084
|
+
if (!this.lastAccessTime) return false
|
|
1085
|
+
|
|
1086
|
+
const timeSinceLastAccess = Date.now() - this.lastAccessTime
|
|
1087
|
+
return timeSinceLastAccess < this.config.warmInstanceTtlMs
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
/**
|
|
1091
|
+
* Load hibernation state from DO storage
|
|
1092
|
+
*/
|
|
1093
|
+
private async loadHibernationState(): Promise<void> {
|
|
1094
|
+
if (!this.config.doStorage || !this.config.persistHibernationState) {
|
|
1095
|
+
return
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
try {
|
|
1099
|
+
const stateKey = this.config.hibernationKeyPrefix + HIBERNATE_STATE_KEY
|
|
1100
|
+
const pagesKey = this.config.hibernationKeyPrefix + HOT_PAGES_KEY
|
|
1101
|
+
|
|
1102
|
+
const [state, pages] = await Promise.all([
|
|
1103
|
+
this.config.doStorage.get<ColdStartHibernateState>(stateKey),
|
|
1104
|
+
this.config.doStorage.get<string[]>(pagesKey),
|
|
1105
|
+
])
|
|
1106
|
+
|
|
1107
|
+
if (state) {
|
|
1108
|
+
this.hibernateState = state
|
|
1109
|
+
this.cumulativeMetrics = state.cumulativeMetrics
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
if (pages) {
|
|
1113
|
+
this.hotPages = new Set(pages)
|
|
1114
|
+
}
|
|
1115
|
+
} catch {
|
|
1116
|
+
// Ignore errors loading state - will cold start
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
/**
|
|
1121
|
+
* Load hot data from DO storage (for quick restore)
|
|
1122
|
+
*/
|
|
1123
|
+
private async loadHotData(): Promise<ArrayBuffer | undefined> {
|
|
1124
|
+
// This would integrate with the tiered storage system
|
|
1125
|
+
// For now, we rely on the optimizer's hot data path
|
|
1126
|
+
return undefined
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
/**
|
|
1130
|
+
* Prefetch hot pages into cache
|
|
1131
|
+
*/
|
|
1132
|
+
private async prefetchHotPages(): Promise<void> {
|
|
1133
|
+
if (!this.config.cacheLayer || this.hotPages.size === 0) {
|
|
1134
|
+
return
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
this.prefetchStats.prefetchesTriggered++
|
|
1138
|
+
const prefetchKeys = Array.from(this.hotPages).slice(0, 10) // Limit concurrent prefetches
|
|
1139
|
+
|
|
1140
|
+
// This would integrate with the cache layer for prefetch
|
|
1141
|
+
// For now, we track the intent
|
|
1142
|
+
this.logDebug(`Would prefetch ${prefetchKeys.length} hot pages`)
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
/**
|
|
1146
|
+
* Track page access for hot page identification
|
|
1147
|
+
*/
|
|
1148
|
+
private trackPageAccess(sql: string): void {
|
|
1149
|
+
// Simple heuristic: extract table names from query
|
|
1150
|
+
const tableMatch = sql.match(/FROM\s+([a-zA-Z_][a-zA-Z0-9_]*)/i)
|
|
1151
|
+
if (tableMatch?.[1]) {
|
|
1152
|
+
const pageKey = `table:${tableMatch[1].toLowerCase()}`
|
|
1153
|
+
this.hotPages.add(pageKey)
|
|
1154
|
+
|
|
1155
|
+
// Enforce max size
|
|
1156
|
+
if (this.hotPages.size > this.config.maxHotPages) {
|
|
1157
|
+
const oldest = this.hotPages.values().next().value
|
|
1158
|
+
if (oldest) {
|
|
1159
|
+
this.hotPages.delete(oldest)
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
/**
|
|
1166
|
+
* Update cumulative metrics with new initialization
|
|
1167
|
+
*/
|
|
1168
|
+
private updateCumulativeMetrics(metrics: ColdStartMetrics): void {
|
|
1169
|
+
this.cumulativeMetrics.totalInits++
|
|
1170
|
+
|
|
1171
|
+
if (metrics.isWarmStart) {
|
|
1172
|
+
this.cumulativeMetrics.warmStarts++
|
|
1173
|
+
this.cumulativeMetrics.avgWarmStartMs = this.updateRunningAverage(
|
|
1174
|
+
this.cumulativeMetrics.avgWarmStartMs,
|
|
1175
|
+
metrics.totalMs,
|
|
1176
|
+
this.cumulativeMetrics.warmStarts
|
|
1177
|
+
)
|
|
1178
|
+
} else {
|
|
1179
|
+
this.cumulativeMetrics.coldStarts++
|
|
1180
|
+
this.cumulativeMetrics.avgColdStartMs = this.updateRunningAverage(
|
|
1181
|
+
this.cumulativeMetrics.avgColdStartMs,
|
|
1182
|
+
metrics.totalMs,
|
|
1183
|
+
this.cumulativeMetrics.coldStarts
|
|
1184
|
+
)
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
/**
|
|
1189
|
+
* Calculate running average
|
|
1190
|
+
*/
|
|
1191
|
+
private updateRunningAverage(
|
|
1192
|
+
currentAvg: number,
|
|
1193
|
+
newValue: number,
|
|
1194
|
+
count: number
|
|
1195
|
+
): number {
|
|
1196
|
+
if (count === 1) return newValue
|
|
1197
|
+
return currentAvg + (newValue - currentAvg) / count
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
/**
|
|
1201
|
+
* Debug logging
|
|
1202
|
+
*/
|
|
1203
|
+
private logDebug(message: string): void {
|
|
1204
|
+
if (this.config.debug) {
|
|
1205
|
+
console.log(`[ColdStartManager:${this.config.databaseId}] ${message}`)
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
// ============================================================================
|
|
1211
|
+
// Factory Functions
|
|
1212
|
+
// ============================================================================
|
|
1213
|
+
|
|
1214
|
+
/**
|
|
1215
|
+
* Create a ColdStartManager instance
|
|
1216
|
+
*
|
|
1217
|
+
* @example
|
|
1218
|
+
* ```typescript
|
|
1219
|
+
* const manager = createColdStartManager({
|
|
1220
|
+
* databaseId: 'my-db',
|
|
1221
|
+
* wasmModule: pgliteWasm,
|
|
1222
|
+
* doStorage: ctx.storage,
|
|
1223
|
+
* r2Bucket: env.R2_BUCKET,
|
|
1224
|
+
* })
|
|
1225
|
+
* ```
|
|
1226
|
+
*/
|
|
1227
|
+
export function createColdStartManager(
|
|
1228
|
+
config: ColdStartManagerConfig
|
|
1229
|
+
): ColdStartManager {
|
|
1230
|
+
return new ColdStartManager(config)
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
/**
|
|
1234
|
+
* Create a ColdStartManager factory for consistent configuration
|
|
1235
|
+
*
|
|
1236
|
+
* @example
|
|
1237
|
+
* ```typescript
|
|
1238
|
+
* const createManager = createColdStartManagerFactory({
|
|
1239
|
+
* wasmModule: pgliteWasm,
|
|
1240
|
+
* r2Bucket: env.R2_BUCKET,
|
|
1241
|
+
* prefetchStrategy: 'hot-warm',
|
|
1242
|
+
* })
|
|
1243
|
+
*
|
|
1244
|
+
* // In DO constructor
|
|
1245
|
+
* this.coldStartManager = createManager({
|
|
1246
|
+
* databaseId: this.ctx.id.toString(),
|
|
1247
|
+
* doStorage: this.ctx.storage,
|
|
1248
|
+
* })
|
|
1249
|
+
* ```
|
|
1250
|
+
*/
|
|
1251
|
+
export function createColdStartManagerFactory(
|
|
1252
|
+
baseConfig: Omit<ColdStartManagerConfig, 'databaseId'>
|
|
1253
|
+
): (instanceConfig: Pick<ColdStartManagerConfig, 'databaseId' | 'doStorage'>) => ColdStartManager {
|
|
1254
|
+
return (instanceConfig) => {
|
|
1255
|
+
return createColdStartManager({
|
|
1256
|
+
...baseConfig,
|
|
1257
|
+
...instanceConfig,
|
|
1258
|
+
})
|
|
1259
|
+
}
|
|
1260
|
+
}
|