@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,920 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* R2OverflowManager - Spill large query results to R2 storage
|
|
3
|
+
*
|
|
4
|
+
* This module manages automatic spillover of large query results to R2 storage
|
|
5
|
+
* when they exceed memory limits in Cloudflare Workers (128MB limit).
|
|
6
|
+
*
|
|
7
|
+
* ## Features
|
|
8
|
+
*
|
|
9
|
+
* - Automatic detection of large result sets
|
|
10
|
+
* - Spillover to R2 storage when threshold exceeded
|
|
11
|
+
* - Transparent retrieval of spilled results
|
|
12
|
+
* - Memory pressure handling with adaptive thresholds
|
|
13
|
+
* - TTL-based cleanup of overflow data
|
|
14
|
+
* - LRU caching for frequently accessed overflow data
|
|
15
|
+
* - Adaptive chunking strategy based on data size
|
|
16
|
+
* - Parallel chunk operations for improved performance
|
|
17
|
+
*
|
|
18
|
+
* ## Performance Characteristics
|
|
19
|
+
*
|
|
20
|
+
* ### Chunking Strategy
|
|
21
|
+
*
|
|
22
|
+
* The manager uses an adaptive chunking strategy that balances network efficiency,
|
|
23
|
+
* memory pressure, and parallelism benefits:
|
|
24
|
+
*
|
|
25
|
+
* | Data Size | Chunk Size | Chunks | Strategy |
|
|
26
|
+
* |----------------|------------|--------|------------------------------|
|
|
27
|
+
* | < 4MB | 1MB | 1-4 | Minimize overhead |
|
|
28
|
+
* | 4MB - 60MB | ~data/6 | ~6 | Optimize parallel throughput |
|
|
29
|
+
* | > 60MB | 10MB | N/10MB | Maximize chunk efficiency |
|
|
30
|
+
*
|
|
31
|
+
* ### Parallel Operations
|
|
32
|
+
*
|
|
33
|
+
* - Upload/download operations run in parallel batches of 4 concurrent requests
|
|
34
|
+
* - This provides 3-4x improvement over sequential operations for multi-chunk data
|
|
35
|
+
* - Memory-conscious: limits concurrent operations to prevent OOM
|
|
36
|
+
*
|
|
37
|
+
* ### LRU Cache
|
|
38
|
+
*
|
|
39
|
+
* - Default max size: 50MB
|
|
40
|
+
* - Single items larger than 25% of max cache are not cached
|
|
41
|
+
* - Automatic eviction of least-recently-used entries
|
|
42
|
+
* - Cache hits bypass R2 entirely for zero-latency retrieval
|
|
43
|
+
*
|
|
44
|
+
* ### Memory Overhead
|
|
45
|
+
*
|
|
46
|
+
* - ~2KB per active overflow entry tracking
|
|
47
|
+
* - Cache entries use actual data size + ~100 bytes metadata
|
|
48
|
+
* - Chunk metadata stored in R2 customMetadata (not counted against cache)
|
|
49
|
+
*
|
|
50
|
+
* ## Usage Example
|
|
51
|
+
*
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const manager = createR2OverflowManager({
|
|
54
|
+
* r2Layer,
|
|
55
|
+
* spillThresholdBytes: 10 * 1024 * 1024, // 10MB
|
|
56
|
+
* memoryPressureThreshold: 0.8,
|
|
57
|
+
* maxInMemoryResultBytes: 50 * 1024 * 1024,
|
|
58
|
+
* overflowTtlMs: 3600000, // 1 hour
|
|
59
|
+
* overflowPrefix: 'overflow/',
|
|
60
|
+
* autoCleanup: true,
|
|
61
|
+
* })
|
|
62
|
+
*
|
|
63
|
+
* // Spill large data
|
|
64
|
+
* if (manager.shouldSpill(largeResult)) {
|
|
65
|
+
* const result = await manager.spill(largeResult)
|
|
66
|
+
* // Store result.overflowKey for later retrieval
|
|
67
|
+
* }
|
|
68
|
+
*
|
|
69
|
+
* // Prefetch for faster access (optional)
|
|
70
|
+
* await manager.prefetch(overflowKey)
|
|
71
|
+
*
|
|
72
|
+
* // Retrieve data (uses cache if available)
|
|
73
|
+
* const data = await manager.retrieveByKey(overflowKey)
|
|
74
|
+
*
|
|
75
|
+
* // Monitor cache performance
|
|
76
|
+
* const cacheStats = manager.getCacheStats()
|
|
77
|
+
* console.log(`Cache hit ratio: ${cacheStats.entries} entries, ${cacheStats.sizeBytes} bytes`)
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* ## Best Practices
|
|
81
|
+
*
|
|
82
|
+
* 1. **Set appropriate thresholds**: Match spillThresholdBytes to your workload
|
|
83
|
+
* 2. **Use prefetch**: When you know data will be needed, prefetch it early
|
|
84
|
+
* 3. **Monitor cache stats**: Adjust cache size based on hit rates
|
|
85
|
+
* 4. **Handle memory pressure**: Register callbacks for proactive management
|
|
86
|
+
* 5. **Cleanup expired data**: Enable autoCleanup or call cleanupExpired periodically
|
|
87
|
+
*
|
|
88
|
+
* @module storage/r2-overflow
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
import type { R2StorageLayer } from './r2-layer'
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Configuration for R2 overflow behavior
|
|
95
|
+
*/
|
|
96
|
+
export interface R2OverflowConfig {
|
|
97
|
+
/** R2 storage layer for overflow data */
|
|
98
|
+
r2Layer: R2StorageLayer
|
|
99
|
+
/** Size threshold in bytes before spilling to R2 (default: 10MB) */
|
|
100
|
+
spillThresholdBytes: number
|
|
101
|
+
/** Memory pressure threshold (0-1) to trigger aggressive spilling */
|
|
102
|
+
memoryPressureThreshold: number
|
|
103
|
+
/** Maximum result size to keep in memory (bytes) */
|
|
104
|
+
maxInMemoryResultBytes: number
|
|
105
|
+
/** TTL for overflow data in R2 (ms) */
|
|
106
|
+
overflowTtlMs: number
|
|
107
|
+
/** Prefix for overflow keys in R2 */
|
|
108
|
+
overflowPrefix: string
|
|
109
|
+
/** Enable automatic cleanup of expired overflow data */
|
|
110
|
+
autoCleanup: boolean
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Result of an overflow operation
|
|
115
|
+
*/
|
|
116
|
+
export interface OverflowResult {
|
|
117
|
+
/** Whether the result was spilled to R2 */
|
|
118
|
+
spilled: boolean
|
|
119
|
+
/** R2 key if spilled */
|
|
120
|
+
overflowKey?: string
|
|
121
|
+
/** Original size in bytes */
|
|
122
|
+
originalSize: number
|
|
123
|
+
/** Timestamp when spilled */
|
|
124
|
+
spilledAt?: number
|
|
125
|
+
/** Number of chunks if split */
|
|
126
|
+
chunks?: number
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Handle for retrieving spilled results
|
|
131
|
+
*/
|
|
132
|
+
export interface SpilledResultHandle {
|
|
133
|
+
/** R2 key for the spilled data */
|
|
134
|
+
key: string
|
|
135
|
+
/** Total size in bytes */
|
|
136
|
+
size: number
|
|
137
|
+
/** Number of chunks */
|
|
138
|
+
chunks: number
|
|
139
|
+
/** When the data was spilled */
|
|
140
|
+
spilledAt: number
|
|
141
|
+
/** When the data expires */
|
|
142
|
+
expiresAt: number
|
|
143
|
+
/** Metadata about the original query */
|
|
144
|
+
metadata: Record<string, string>
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Memory pressure signal
|
|
149
|
+
*/
|
|
150
|
+
export interface MemoryPressureSignal {
|
|
151
|
+
/** Current memory usage ratio (0-1) */
|
|
152
|
+
usageRatio: number
|
|
153
|
+
/** Available memory in bytes */
|
|
154
|
+
availableBytes: number
|
|
155
|
+
/** Whether immediate action is required */
|
|
156
|
+
critical: boolean
|
|
157
|
+
/** Source of the signal */
|
|
158
|
+
source: 'runtime' | 'manual' | 'periodic'
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Statistics for overflow operations
|
|
163
|
+
*/
|
|
164
|
+
export interface OverflowStats {
|
|
165
|
+
/** Number of results spilled to R2 */
|
|
166
|
+
spillCount: number
|
|
167
|
+
/** Total bytes spilled */
|
|
168
|
+
bytesSpilled: number
|
|
169
|
+
/** Number of retrievals from R2 */
|
|
170
|
+
retrievalCount: number
|
|
171
|
+
/** Total bytes retrieved */
|
|
172
|
+
bytesRetrieved: number
|
|
173
|
+
/** Number of cleanup operations */
|
|
174
|
+
cleanupCount: number
|
|
175
|
+
/** Bytes cleaned up */
|
|
176
|
+
bytesCleanedUp: number
|
|
177
|
+
/** Number of memory pressure events handled */
|
|
178
|
+
memoryPressureEvents: number
|
|
179
|
+
/** Current overflow entries in R2 */
|
|
180
|
+
activeOverflows: number
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Chunking Constants
|
|
185
|
+
*
|
|
186
|
+
* Adaptive chunking strategy balances:
|
|
187
|
+
* - Network efficiency (larger chunks = fewer requests)
|
|
188
|
+
* - Memory pressure (smaller chunks = lower peak memory)
|
|
189
|
+
* - Parallelism benefits (more chunks = better parallel throughput)
|
|
190
|
+
*/
|
|
191
|
+
/** Minimum chunk size (1MB) - for smaller datasets or high memory pressure */
|
|
192
|
+
const MIN_CHUNK_SIZE = 1 * 1024 * 1024
|
|
193
|
+
/** Maximum chunk size (10MB) - optimal for large sequential transfers */
|
|
194
|
+
const MAX_CHUNK_SIZE = 10 * 1024 * 1024
|
|
195
|
+
/** Target number of chunks for parallel operations (4-8 is optimal for most networks) */
|
|
196
|
+
const TARGET_CHUNK_COUNT = 6
|
|
197
|
+
/** Maximum concurrent chunk operations */
|
|
198
|
+
const MAX_PARALLEL_OPERATIONS = 4
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* LRU Cache entry for overflow data
|
|
202
|
+
*/
|
|
203
|
+
interface CacheEntry {
|
|
204
|
+
data: Uint8Array
|
|
205
|
+
key: string
|
|
206
|
+
size: number
|
|
207
|
+
accessedAt: number
|
|
208
|
+
createdAt: number
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* LRU Cache for frequently accessed overflow data
|
|
213
|
+
*/
|
|
214
|
+
class OverflowLRUCache {
|
|
215
|
+
private cache: Map<string, CacheEntry>
|
|
216
|
+
private maxSizeBytes: number
|
|
217
|
+
private currentSizeBytes: number
|
|
218
|
+
|
|
219
|
+
constructor(maxSizeBytes: number = 50 * 1024 * 1024) {
|
|
220
|
+
this.cache = new Map()
|
|
221
|
+
this.maxSizeBytes = maxSizeBytes
|
|
222
|
+
this.currentSizeBytes = 0
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
get(key: string): Uint8Array | null {
|
|
226
|
+
const entry = this.cache.get(key)
|
|
227
|
+
if (!entry) return null
|
|
228
|
+
|
|
229
|
+
// Update access time and move to end (most recently used)
|
|
230
|
+
entry.accessedAt = Date.now()
|
|
231
|
+
this.cache.delete(key)
|
|
232
|
+
this.cache.set(key, entry)
|
|
233
|
+
|
|
234
|
+
return entry.data
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
set(key: string, data: Uint8Array): void {
|
|
238
|
+
const size = data.length
|
|
239
|
+
|
|
240
|
+
// Don't cache items larger than 25% of max cache size
|
|
241
|
+
if (size > this.maxSizeBytes * 0.25) return
|
|
242
|
+
|
|
243
|
+
// Remove existing entry if present
|
|
244
|
+
if (this.cache.has(key)) {
|
|
245
|
+
const existing = this.cache.get(key)!
|
|
246
|
+
this.currentSizeBytes -= existing.size
|
|
247
|
+
this.cache.delete(key)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Evict LRU entries until we have space
|
|
251
|
+
while (this.currentSizeBytes + size > this.maxSizeBytes && this.cache.size > 0) {
|
|
252
|
+
const oldestKey = this.cache.keys().next().value
|
|
253
|
+
if (oldestKey) {
|
|
254
|
+
const entry = this.cache.get(oldestKey)!
|
|
255
|
+
this.currentSizeBytes -= entry.size
|
|
256
|
+
this.cache.delete(oldestKey)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Add new entry
|
|
261
|
+
const entry: CacheEntry = {
|
|
262
|
+
data,
|
|
263
|
+
key,
|
|
264
|
+
size,
|
|
265
|
+
accessedAt: Date.now(),
|
|
266
|
+
createdAt: Date.now(),
|
|
267
|
+
}
|
|
268
|
+
this.cache.set(key, entry)
|
|
269
|
+
this.currentSizeBytes += size
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
delete(key: string): boolean {
|
|
273
|
+
const entry = this.cache.get(key)
|
|
274
|
+
if (!entry) return false
|
|
275
|
+
|
|
276
|
+
this.currentSizeBytes -= entry.size
|
|
277
|
+
this.cache.delete(key)
|
|
278
|
+
return true
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
clear(): void {
|
|
282
|
+
this.cache.clear()
|
|
283
|
+
this.currentSizeBytes = 0
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
getStats(): { entries: number; sizeBytes: number; maxSizeBytes: number } {
|
|
287
|
+
return {
|
|
288
|
+
entries: this.cache.size,
|
|
289
|
+
sizeBytes: this.currentSizeBytes,
|
|
290
|
+
maxSizeBytes: this.maxSizeBytes,
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
setMaxSize(maxSizeBytes: number): void {
|
|
295
|
+
this.maxSizeBytes = maxSizeBytes
|
|
296
|
+
// Evict if over new limit
|
|
297
|
+
while (this.currentSizeBytes > this.maxSizeBytes && this.cache.size > 0) {
|
|
298
|
+
const oldestKey = this.cache.keys().next().value
|
|
299
|
+
if (oldestKey) {
|
|
300
|
+
const entry = this.cache.get(oldestKey)!
|
|
301
|
+
this.currentSizeBytes -= entry.size
|
|
302
|
+
this.cache.delete(oldestKey)
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Calculate optimal chunk size based on total data size
|
|
310
|
+
*
|
|
311
|
+
* Strategy:
|
|
312
|
+
* - Small data (< 10MB): Use minimum chunk size for quick transfer
|
|
313
|
+
* - Medium data (10MB - 100MB): Target 4-8 chunks for parallel benefit
|
|
314
|
+
* - Large data (> 100MB): Use maximum chunk size to reduce overhead
|
|
315
|
+
*/
|
|
316
|
+
function calculateOptimalChunkSize(totalSize: number): number {
|
|
317
|
+
if (totalSize < MIN_CHUNK_SIZE * 4) {
|
|
318
|
+
// Small data: use minimum chunks
|
|
319
|
+
return MIN_CHUNK_SIZE
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (totalSize > MAX_CHUNK_SIZE * TARGET_CHUNK_COUNT) {
|
|
323
|
+
// Very large data: use maximum chunk size
|
|
324
|
+
return MAX_CHUNK_SIZE
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Medium data: target optimal chunk count
|
|
328
|
+
const idealChunkSize = Math.ceil(totalSize / TARGET_CHUNK_COUNT)
|
|
329
|
+
return Math.max(MIN_CHUNK_SIZE, Math.min(MAX_CHUNK_SIZE, idealChunkSize))
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* R2OverflowManager handles automatic spillover of large query results to R2.
|
|
334
|
+
*
|
|
335
|
+
* When query results exceed the configured threshold, they are automatically
|
|
336
|
+
* stored in R2 and a handle is returned that can be used to retrieve them later.
|
|
337
|
+
*
|
|
338
|
+
* @example
|
|
339
|
+
* ```typescript
|
|
340
|
+
* const manager = createR2OverflowManager({
|
|
341
|
+
* r2Layer,
|
|
342
|
+
* spillThresholdBytes: 10 * 1024 * 1024, // 10MB
|
|
343
|
+
* memoryPressureThreshold: 0.8,
|
|
344
|
+
* maxInMemoryResultBytes: 50 * 1024 * 1024,
|
|
345
|
+
* overflowTtlMs: 3600000, // 1 hour
|
|
346
|
+
* overflowPrefix: 'overflow/',
|
|
347
|
+
* autoCleanup: true,
|
|
348
|
+
* })
|
|
349
|
+
*
|
|
350
|
+
* // Check if data should spill
|
|
351
|
+
* if (manager.shouldSpill(largeResult)) {
|
|
352
|
+
* const result = await manager.spill(largeResult)
|
|
353
|
+
* // Store result.overflowKey for later retrieval
|
|
354
|
+
* }
|
|
355
|
+
*
|
|
356
|
+
* // Later, retrieve the data
|
|
357
|
+
* const data = await manager.retrieveByKey(overflowKey)
|
|
358
|
+
* ```
|
|
359
|
+
*/
|
|
360
|
+
export class R2OverflowManager {
|
|
361
|
+
private config: R2OverflowConfig
|
|
362
|
+
private originalSpillThreshold: number
|
|
363
|
+
private stats: OverflowStats
|
|
364
|
+
private activeOverflows: Map<string, SpilledResultHandle>
|
|
365
|
+
private overflowCallbacks: Array<(result: OverflowResult) => void>
|
|
366
|
+
private memoryPressureCallbacks: Array<(signal: MemoryPressureSignal) => void>
|
|
367
|
+
private keyCounter: number
|
|
368
|
+
private cache: OverflowLRUCache
|
|
369
|
+
|
|
370
|
+
constructor(config: R2OverflowConfig) {
|
|
371
|
+
this.config = { ...config }
|
|
372
|
+
this.originalSpillThreshold = config.spillThresholdBytes
|
|
373
|
+
this.stats = {
|
|
374
|
+
spillCount: 0,
|
|
375
|
+
bytesSpilled: 0,
|
|
376
|
+
retrievalCount: 0,
|
|
377
|
+
bytesRetrieved: 0,
|
|
378
|
+
cleanupCount: 0,
|
|
379
|
+
bytesCleanedUp: 0,
|
|
380
|
+
memoryPressureEvents: 0,
|
|
381
|
+
activeOverflows: 0,
|
|
382
|
+
}
|
|
383
|
+
this.activeOverflows = new Map()
|
|
384
|
+
this.overflowCallbacks = []
|
|
385
|
+
this.memoryPressureCallbacks = []
|
|
386
|
+
this.keyCounter = 0
|
|
387
|
+
// Initialize LRU cache with 50MB default max size
|
|
388
|
+
this.cache = new OverflowLRUCache(50 * 1024 * 1024)
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Check if data should be spilled to R2 based on size threshold
|
|
393
|
+
*/
|
|
394
|
+
shouldSpill(data: Uint8Array): boolean {
|
|
395
|
+
return data.length > this.config.spillThresholdBytes
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Spill data to R2 and return handle
|
|
400
|
+
*
|
|
401
|
+
* Data under the threshold will not be spilled.
|
|
402
|
+
* Very large data will be split into chunks with adaptive sizing.
|
|
403
|
+
* Chunks are uploaded in parallel for improved performance.
|
|
404
|
+
*/
|
|
405
|
+
async spill(data: Uint8Array, metadata?: Record<string, string>): Promise<OverflowResult> {
|
|
406
|
+
const originalSize = data.length
|
|
407
|
+
|
|
408
|
+
// Don't spill empty or small data
|
|
409
|
+
if (originalSize === 0 || originalSize <= this.config.spillThresholdBytes) {
|
|
410
|
+
return {
|
|
411
|
+
spilled: false,
|
|
412
|
+
originalSize,
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
const spilledAt = Date.now()
|
|
417
|
+
const overflowKey = this.generateKey()
|
|
418
|
+
const expiresAt = spilledAt + this.config.overflowTtlMs
|
|
419
|
+
|
|
420
|
+
// Calculate adaptive chunk size based on data size
|
|
421
|
+
const chunkSize = calculateOptimalChunkSize(originalSize)
|
|
422
|
+
const numChunks = Math.ceil(originalSize / chunkSize)
|
|
423
|
+
|
|
424
|
+
const fullMetadata = {
|
|
425
|
+
...metadata,
|
|
426
|
+
originalSize: originalSize.toString(),
|
|
427
|
+
spilledAt: spilledAt.toString(),
|
|
428
|
+
expiresAt: expiresAt.toString(),
|
|
429
|
+
chunks: numChunks.toString(),
|
|
430
|
+
chunkSize: chunkSize.toString(),
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if (numChunks === 1) {
|
|
434
|
+
// Single chunk - write directly
|
|
435
|
+
await this.config.r2Layer.put(overflowKey, data, {
|
|
436
|
+
customMetadata: fullMetadata,
|
|
437
|
+
})
|
|
438
|
+
} else {
|
|
439
|
+
// Multiple chunks - upload in parallel batches
|
|
440
|
+
const uploadChunk = async (chunkIndex: number) => {
|
|
441
|
+
const start = chunkIndex * chunkSize
|
|
442
|
+
const end = Math.min(start + chunkSize, originalSize)
|
|
443
|
+
const chunkData = data.slice(start, end)
|
|
444
|
+
const chunkKey = `${overflowKey}:chunk:${chunkIndex}`
|
|
445
|
+
|
|
446
|
+
await this.config.r2Layer.put(chunkKey, chunkData, {
|
|
447
|
+
customMetadata: {
|
|
448
|
+
...fullMetadata,
|
|
449
|
+
chunkIndex: chunkIndex.toString(),
|
|
450
|
+
chunkStart: start.toString(),
|
|
451
|
+
chunkEnd: end.toString(),
|
|
452
|
+
},
|
|
453
|
+
})
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// Upload chunks in parallel batches
|
|
457
|
+
for (let batchStart = 0; batchStart < numChunks; batchStart += MAX_PARALLEL_OPERATIONS) {
|
|
458
|
+
const batchEnd = Math.min(batchStart + MAX_PARALLEL_OPERATIONS, numChunks)
|
|
459
|
+
const batchPromises: Promise<void>[] = []
|
|
460
|
+
|
|
461
|
+
for (let i = batchStart; i < batchEnd; i++) {
|
|
462
|
+
batchPromises.push(uploadChunk(i))
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
await Promise.all(batchPromises)
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// Track the overflow
|
|
470
|
+
const handle: SpilledResultHandle = {
|
|
471
|
+
key: overflowKey,
|
|
472
|
+
size: originalSize,
|
|
473
|
+
chunks: numChunks,
|
|
474
|
+
spilledAt,
|
|
475
|
+
expiresAt,
|
|
476
|
+
metadata: metadata || {},
|
|
477
|
+
}
|
|
478
|
+
this.activeOverflows.set(overflowKey, handle)
|
|
479
|
+
|
|
480
|
+
// Update stats
|
|
481
|
+
this.stats.spillCount++
|
|
482
|
+
this.stats.bytesSpilled += originalSize
|
|
483
|
+
this.stats.activeOverflows = this.activeOverflows.size
|
|
484
|
+
|
|
485
|
+
const result: OverflowResult = {
|
|
486
|
+
spilled: true,
|
|
487
|
+
overflowKey,
|
|
488
|
+
originalSize,
|
|
489
|
+
spilledAt,
|
|
490
|
+
chunks: numChunks,
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// Notify callbacks
|
|
494
|
+
for (const callback of this.overflowCallbacks) {
|
|
495
|
+
callback(result)
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
return result
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Retrieve spilled data by handle
|
|
503
|
+
*
|
|
504
|
+
* Uses LRU cache for frequently accessed data.
|
|
505
|
+
* Downloads chunks in parallel for improved performance.
|
|
506
|
+
*/
|
|
507
|
+
async retrieve(handle: SpilledResultHandle): Promise<Uint8Array> {
|
|
508
|
+
// Check cache first
|
|
509
|
+
const cached = this.cache.get(handle.key)
|
|
510
|
+
if (cached) {
|
|
511
|
+
this.stats.retrievalCount++
|
|
512
|
+
this.stats.bytesRetrieved += cached.length
|
|
513
|
+
return cached
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
let result: Uint8Array
|
|
517
|
+
|
|
518
|
+
if (handle.chunks === 1) {
|
|
519
|
+
// Single chunk - read directly
|
|
520
|
+
const data = await this.config.r2Layer.get(handle.key)
|
|
521
|
+
if (!data) {
|
|
522
|
+
throw new Error(`Overflow data not found: ${handle.key}`)
|
|
523
|
+
}
|
|
524
|
+
result = data
|
|
525
|
+
} else {
|
|
526
|
+
// Multiple chunks - download in parallel batches
|
|
527
|
+
const chunkResults: Array<{ index: number; data: Uint8Array }> = []
|
|
528
|
+
|
|
529
|
+
const downloadChunk = async (chunkIndex: number) => {
|
|
530
|
+
const chunkKey = `${handle.key}:chunk:${chunkIndex}`
|
|
531
|
+
const chunkData = await this.config.r2Layer.get(chunkKey)
|
|
532
|
+
if (!chunkData) {
|
|
533
|
+
throw new Error(`Chunk not found: ${chunkKey}`)
|
|
534
|
+
}
|
|
535
|
+
return { index: chunkIndex, data: chunkData }
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
// Download chunks in parallel batches
|
|
539
|
+
for (let batchStart = 0; batchStart < handle.chunks; batchStart += MAX_PARALLEL_OPERATIONS) {
|
|
540
|
+
const batchEnd = Math.min(batchStart + MAX_PARALLEL_OPERATIONS, handle.chunks)
|
|
541
|
+
const batchPromises: Promise<{ index: number; data: Uint8Array }>[] = []
|
|
542
|
+
|
|
543
|
+
for (let i = batchStart; i < batchEnd; i++) {
|
|
544
|
+
batchPromises.push(downloadChunk(i))
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
const batchResults = await Promise.all(batchPromises)
|
|
548
|
+
chunkResults.push(...batchResults)
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// Sort by index and combine
|
|
552
|
+
chunkResults.sort((a, b) => a.index - b.index)
|
|
553
|
+
const totalSize = chunkResults.reduce((sum, c) => sum + c.data.length, 0)
|
|
554
|
+
|
|
555
|
+
result = new Uint8Array(totalSize)
|
|
556
|
+
let offset = 0
|
|
557
|
+
for (const chunk of chunkResults) {
|
|
558
|
+
result.set(chunk.data, offset)
|
|
559
|
+
offset += chunk.data.length
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// Update stats
|
|
564
|
+
this.stats.retrievalCount++
|
|
565
|
+
this.stats.bytesRetrieved += result.length
|
|
566
|
+
|
|
567
|
+
// Cache for future access
|
|
568
|
+
this.cache.set(handle.key, result)
|
|
569
|
+
|
|
570
|
+
return result
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Retrieve spilled data by key directly
|
|
575
|
+
*
|
|
576
|
+
* Uses LRU cache for frequently accessed data.
|
|
577
|
+
* Falls back to R2 retrieval if not cached or tracked.
|
|
578
|
+
*/
|
|
579
|
+
async retrieveByKey(key: string): Promise<Uint8Array | null> {
|
|
580
|
+
// Check cache first (even for untracked keys)
|
|
581
|
+
const cached = this.cache.get(key)
|
|
582
|
+
if (cached) {
|
|
583
|
+
this.stats.retrievalCount++
|
|
584
|
+
this.stats.bytesRetrieved += cached.length
|
|
585
|
+
return cached
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
// Try to get the handle from our tracking
|
|
589
|
+
const handle = this.activeOverflows.get(key)
|
|
590
|
+
|
|
591
|
+
if (handle) {
|
|
592
|
+
return this.retrieve(handle)
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
// Direct retrieval for untracked keys
|
|
596
|
+
const data = await this.config.r2Layer.get(key)
|
|
597
|
+
if (data) {
|
|
598
|
+
this.stats.retrievalCount++
|
|
599
|
+
this.stats.bytesRetrieved += data.length
|
|
600
|
+
// Cache for future access
|
|
601
|
+
this.cache.set(key, data)
|
|
602
|
+
}
|
|
603
|
+
return data
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Clean up a specific overflow entry by key
|
|
608
|
+
*
|
|
609
|
+
* Removes data from R2 and invalidates cache entry.
|
|
610
|
+
*/
|
|
611
|
+
async cleanup(key: string): Promise<boolean> {
|
|
612
|
+
// Always remove from cache regardless of tracking status
|
|
613
|
+
this.cache.delete(key)
|
|
614
|
+
|
|
615
|
+
const handle = this.activeOverflows.get(key)
|
|
616
|
+
|
|
617
|
+
if (!handle) {
|
|
618
|
+
// Check if key exists in R2
|
|
619
|
+
const exists = await this.config.r2Layer.has(key)
|
|
620
|
+
if (!exists) {
|
|
621
|
+
return false
|
|
622
|
+
}
|
|
623
|
+
// Delete even if not tracked
|
|
624
|
+
await this.config.r2Layer.delete(key)
|
|
625
|
+
return true
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
const size = handle.size
|
|
629
|
+
|
|
630
|
+
if (handle.chunks === 1) {
|
|
631
|
+
// Single chunk
|
|
632
|
+
await this.config.r2Layer.delete(key)
|
|
633
|
+
} else {
|
|
634
|
+
// Multiple chunks - delete all
|
|
635
|
+
const chunkKeys = Array.from({ length: handle.chunks }, (_, i) => `${key}:chunk:${i}`)
|
|
636
|
+
await this.config.r2Layer.deleteMany(chunkKeys)
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
// Remove from tracking
|
|
640
|
+
this.activeOverflows.delete(key)
|
|
641
|
+
|
|
642
|
+
// Update stats
|
|
643
|
+
this.stats.cleanupCount++
|
|
644
|
+
this.stats.bytesCleanedUp += size
|
|
645
|
+
this.stats.activeOverflows = this.activeOverflows.size
|
|
646
|
+
|
|
647
|
+
return true
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/**
|
|
651
|
+
* Clean up all expired overflow entries
|
|
652
|
+
*/
|
|
653
|
+
async cleanupExpired(): Promise<number> {
|
|
654
|
+
const now = Date.now()
|
|
655
|
+
const expiredKeys: string[] = []
|
|
656
|
+
|
|
657
|
+
// Check tracked overflows
|
|
658
|
+
for (const [key, handle] of this.activeOverflows) {
|
|
659
|
+
if (handle.expiresAt <= now) {
|
|
660
|
+
expiredKeys.push(key)
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// Also check R2 for any untracked expired entries
|
|
665
|
+
const allKeys = await this.config.r2Layer.listAll()
|
|
666
|
+
for (const key of allKeys) {
|
|
667
|
+
if (!this.activeOverflows.has(key)) {
|
|
668
|
+
const head = await this.config.r2Layer.head(key)
|
|
669
|
+
if (head?.customMetadata?.expiresAt) {
|
|
670
|
+
const expiresAt = parseInt(head.customMetadata.expiresAt, 10)
|
|
671
|
+
if (expiresAt <= now && !expiredKeys.includes(key)) {
|
|
672
|
+
expiredKeys.push(key)
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
if (expiredKeys.length === 0) {
|
|
679
|
+
return 0
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// Delete all expired entries
|
|
683
|
+
await this.config.r2Layer.deleteMany(expiredKeys)
|
|
684
|
+
|
|
685
|
+
// Remove from tracking
|
|
686
|
+
for (const key of expiredKeys) {
|
|
687
|
+
const handle = this.activeOverflows.get(key)
|
|
688
|
+
if (handle) {
|
|
689
|
+
this.stats.bytesCleanedUp += handle.size
|
|
690
|
+
this.activeOverflows.delete(key)
|
|
691
|
+
}
|
|
692
|
+
// Also remove from cache
|
|
693
|
+
this.cache.delete(key)
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
this.stats.cleanupCount += expiredKeys.length
|
|
697
|
+
this.stats.activeOverflows = this.activeOverflows.size
|
|
698
|
+
|
|
699
|
+
return expiredKeys.length
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* Handle memory pressure signal
|
|
704
|
+
*
|
|
705
|
+
* When memory pressure is high, the manager will:
|
|
706
|
+
* 1. Lower the spill threshold to encourage more spillover
|
|
707
|
+
* 2. Trigger cleanup of expired entries (if critical)
|
|
708
|
+
*/
|
|
709
|
+
async handleMemoryPressure(signal: MemoryPressureSignal): Promise<void> {
|
|
710
|
+
this.stats.memoryPressureEvents++
|
|
711
|
+
|
|
712
|
+
// Notify callbacks
|
|
713
|
+
for (const callback of this.memoryPressureCallbacks) {
|
|
714
|
+
callback(signal)
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
// Adjust threshold based on pressure
|
|
718
|
+
if (signal.usageRatio >= this.config.memoryPressureThreshold) {
|
|
719
|
+
// Calculate reduced threshold based on pressure severity
|
|
720
|
+
const pressureFactor = 1 - ((signal.usageRatio - this.config.memoryPressureThreshold) / (1 - this.config.memoryPressureThreshold))
|
|
721
|
+
const reducedThreshold = Math.max(
|
|
722
|
+
1024, // Minimum 1KB
|
|
723
|
+
Math.floor(this.originalSpillThreshold * pressureFactor * 0.5)
|
|
724
|
+
)
|
|
725
|
+
this.config.spillThresholdBytes = reducedThreshold
|
|
726
|
+
} else if (signal.usageRatio < this.config.memoryPressureThreshold) {
|
|
727
|
+
// Gradually restore threshold when pressure subsides
|
|
728
|
+
const restorationFactor = 1 - (signal.usageRatio / this.config.memoryPressureThreshold)
|
|
729
|
+
const restoredThreshold = Math.min(
|
|
730
|
+
this.originalSpillThreshold,
|
|
731
|
+
this.config.spillThresholdBytes + Math.floor((this.originalSpillThreshold - this.config.spillThresholdBytes) * restorationFactor)
|
|
732
|
+
)
|
|
733
|
+
this.config.spillThresholdBytes = restoredThreshold
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// Trigger cleanup on critical pressure
|
|
737
|
+
if (signal.critical && this.config.autoCleanup) {
|
|
738
|
+
await this.cleanupExpired()
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
/**
|
|
743
|
+
* Get all active overflow handles
|
|
744
|
+
*/
|
|
745
|
+
getActiveOverflows(): SpilledResultHandle[] {
|
|
746
|
+
return Array.from(this.activeOverflows.values())
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
* Get statistics
|
|
751
|
+
*/
|
|
752
|
+
getStats(): OverflowStats {
|
|
753
|
+
return { ...this.stats }
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
/**
|
|
757
|
+
* Reset statistics
|
|
758
|
+
*/
|
|
759
|
+
resetStats(): void {
|
|
760
|
+
this.stats = {
|
|
761
|
+
spillCount: 0,
|
|
762
|
+
bytesSpilled: 0,
|
|
763
|
+
retrievalCount: 0,
|
|
764
|
+
bytesRetrieved: 0,
|
|
765
|
+
cleanupCount: 0,
|
|
766
|
+
bytesCleanedUp: 0,
|
|
767
|
+
memoryPressureEvents: 0,
|
|
768
|
+
activeOverflows: this.activeOverflows.size,
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
/**
|
|
773
|
+
* Configure the manager
|
|
774
|
+
*/
|
|
775
|
+
configure(config: Partial<R2OverflowConfig>): void {
|
|
776
|
+
if (config.spillThresholdBytes !== undefined) {
|
|
777
|
+
this.config.spillThresholdBytes = config.spillThresholdBytes
|
|
778
|
+
this.originalSpillThreshold = config.spillThresholdBytes
|
|
779
|
+
}
|
|
780
|
+
if (config.memoryPressureThreshold !== undefined) {
|
|
781
|
+
this.config.memoryPressureThreshold = config.memoryPressureThreshold
|
|
782
|
+
}
|
|
783
|
+
if (config.maxInMemoryResultBytes !== undefined) {
|
|
784
|
+
this.config.maxInMemoryResultBytes = config.maxInMemoryResultBytes
|
|
785
|
+
}
|
|
786
|
+
if (config.overflowTtlMs !== undefined) {
|
|
787
|
+
this.config.overflowTtlMs = config.overflowTtlMs
|
|
788
|
+
}
|
|
789
|
+
if (config.overflowPrefix !== undefined) {
|
|
790
|
+
this.config.overflowPrefix = config.overflowPrefix
|
|
791
|
+
}
|
|
792
|
+
if (config.autoCleanup !== undefined) {
|
|
793
|
+
this.config.autoCleanup = config.autoCleanup
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
/**
|
|
798
|
+
* Get current configuration
|
|
799
|
+
*/
|
|
800
|
+
getConfig(): R2OverflowConfig {
|
|
801
|
+
return { ...this.config }
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* Register callback for overflow events
|
|
806
|
+
*/
|
|
807
|
+
onOverflow(callback: (result: OverflowResult) => void): void {
|
|
808
|
+
this.overflowCallbacks.push(callback)
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
/**
|
|
812
|
+
* Register callback for memory pressure events
|
|
813
|
+
*/
|
|
814
|
+
onMemoryPressure(callback: (signal: MemoryPressureSignal) => void): void {
|
|
815
|
+
this.memoryPressureCallbacks.push(callback)
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
/**
|
|
819
|
+
* Generate a unique key for overflow data
|
|
820
|
+
*/
|
|
821
|
+
private generateKey(): string {
|
|
822
|
+
const timestamp = Date.now()
|
|
823
|
+
const random = Math.random().toString(36).substring(2, 10)
|
|
824
|
+
const counter = this.keyCounter++
|
|
825
|
+
return `${this.config.overflowPrefix}${timestamp}-${random}-${counter}`
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
// ============================================
|
|
829
|
+
// Cache Management API
|
|
830
|
+
// ============================================
|
|
831
|
+
|
|
832
|
+
/**
|
|
833
|
+
* Get cache statistics
|
|
834
|
+
*
|
|
835
|
+
* Returns information about the LRU cache state including
|
|
836
|
+
* number of entries, current size, and maximum size.
|
|
837
|
+
*/
|
|
838
|
+
getCacheStats(): { entries: number; sizeBytes: number; maxSizeBytes: number } {
|
|
839
|
+
return this.cache.getStats()
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
/**
|
|
843
|
+
* Set maximum cache size
|
|
844
|
+
*
|
|
845
|
+
* Adjusts the maximum cache size. If the current cache exceeds
|
|
846
|
+
* the new limit, entries will be evicted (LRU order).
|
|
847
|
+
*
|
|
848
|
+
* @param maxSizeBytes - Maximum cache size in bytes
|
|
849
|
+
*/
|
|
850
|
+
setCacheMaxSize(maxSizeBytes: number): void {
|
|
851
|
+
this.cache.setMaxSize(maxSizeBytes)
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
/**
|
|
855
|
+
* Clear the entire cache
|
|
856
|
+
*
|
|
857
|
+
* Removes all cached entries. Does not affect R2 storage.
|
|
858
|
+
*/
|
|
859
|
+
clearCache(): void {
|
|
860
|
+
this.cache.clear()
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
/**
|
|
864
|
+
* Prefetch data into cache
|
|
865
|
+
*
|
|
866
|
+
* Proactively loads data from R2 into the cache for faster
|
|
867
|
+
* subsequent access. Useful when you know data will be needed soon.
|
|
868
|
+
*
|
|
869
|
+
* @param key - The overflow key to prefetch
|
|
870
|
+
* @returns true if prefetch succeeded, false if data not found
|
|
871
|
+
*/
|
|
872
|
+
async prefetch(key: string): Promise<boolean> {
|
|
873
|
+
// Already cached?
|
|
874
|
+
if (this.cache.get(key)) {
|
|
875
|
+
return true
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
const handle = this.activeOverflows.get(key)
|
|
879
|
+
if (handle) {
|
|
880
|
+
try {
|
|
881
|
+
await this.retrieve(handle)
|
|
882
|
+
return true
|
|
883
|
+
} catch {
|
|
884
|
+
return false
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
// Try direct retrieval
|
|
889
|
+
const data = await this.config.r2Layer.get(key)
|
|
890
|
+
if (data) {
|
|
891
|
+
this.cache.set(key, data)
|
|
892
|
+
return true
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
return false
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* Invalidate a specific cache entry
|
|
900
|
+
*
|
|
901
|
+
* Removes an entry from the cache without affecting R2 storage.
|
|
902
|
+
* Useful when you know the data has changed externally.
|
|
903
|
+
*
|
|
904
|
+
* @param key - The overflow key to invalidate
|
|
905
|
+
* @returns true if entry was in cache and removed
|
|
906
|
+
*/
|
|
907
|
+
invalidateCache(key: string): boolean {
|
|
908
|
+
return this.cache.delete(key)
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
/**
|
|
913
|
+
* Create a new R2OverflowManager instance
|
|
914
|
+
*
|
|
915
|
+
* @param config - Configuration for the overflow manager
|
|
916
|
+
* @returns A configured R2OverflowManager instance
|
|
917
|
+
*/
|
|
918
|
+
export function createR2OverflowManager(config: R2OverflowConfig): R2OverflowManager {
|
|
919
|
+
return new R2OverflowManager(config)
|
|
920
|
+
}
|