@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,1109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for DO Connection Pool
|
|
3
|
+
*
|
|
4
|
+
* Task: postgres-zjj
|
|
5
|
+
*
|
|
6
|
+
* Tests cover:
|
|
7
|
+
* - Basic pool operations (acquire, release, destroy)
|
|
8
|
+
* - Connection reuse
|
|
9
|
+
* - Max pool size enforcement
|
|
10
|
+
* - Idle connection timeout
|
|
11
|
+
* - Health checking
|
|
12
|
+
* - Fair queuing when pool exhausted
|
|
13
|
+
* - High-concurrency scenarios
|
|
14
|
+
* - Pool metrics
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
|
|
18
|
+
import {
|
|
19
|
+
DOConnectionPool,
|
|
20
|
+
DOPoolConfig,
|
|
21
|
+
DOPoolMetrics,
|
|
22
|
+
PoolableConnection,
|
|
23
|
+
ConnectionFactory,
|
|
24
|
+
HealthChecker,
|
|
25
|
+
} from './do-connection-pool'
|
|
26
|
+
|
|
27
|
+
// Mock connection implementation
|
|
28
|
+
class MockConnection implements PoolableConnection {
|
|
29
|
+
readonly id: string
|
|
30
|
+
private lastActivity: number
|
|
31
|
+
private _healthy = true
|
|
32
|
+
private _closed = false
|
|
33
|
+
public closeDelay = 0
|
|
34
|
+
|
|
35
|
+
constructor(id: string) {
|
|
36
|
+
this.id = id
|
|
37
|
+
this.lastActivity = Date.now()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
isHealthy(): boolean {
|
|
41
|
+
return this._healthy && !this._closed
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async close(): Promise<void> {
|
|
45
|
+
if (this.closeDelay > 0) {
|
|
46
|
+
await new Promise(resolve => setTimeout(resolve, this.closeDelay))
|
|
47
|
+
}
|
|
48
|
+
this._closed = true
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
getLastActivity(): number {
|
|
52
|
+
return this.lastActivity
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
touch(): void {
|
|
56
|
+
this.lastActivity = Date.now()
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
markUnhealthy(): void {
|
|
60
|
+
this._healthy = false
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
markHealthy(): void {
|
|
64
|
+
this._healthy = true
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
get isClosed(): boolean {
|
|
68
|
+
return this._closed
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Factory helper
|
|
73
|
+
let connectionIdCounter = 0
|
|
74
|
+
|
|
75
|
+
function createMockFactory(delay = 0): ConnectionFactory<MockConnection> {
|
|
76
|
+
return async () => {
|
|
77
|
+
if (delay > 0) {
|
|
78
|
+
await new Promise(resolve => setTimeout(resolve, delay))
|
|
79
|
+
}
|
|
80
|
+
return new MockConnection(`mock-${++connectionIdCounter}`)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function createFailingFactory(failCount: number): ConnectionFactory<MockConnection> {
|
|
85
|
+
let failures = 0
|
|
86
|
+
return async () => {
|
|
87
|
+
if (failures < failCount) {
|
|
88
|
+
failures++
|
|
89
|
+
throw new Error('Connection failed')
|
|
90
|
+
}
|
|
91
|
+
return new MockConnection(`mock-${++connectionIdCounter}`)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
describe('DOConnectionPool', () => {
|
|
96
|
+
beforeEach(() => {
|
|
97
|
+
connectionIdCounter = 0
|
|
98
|
+
vi.useFakeTimers()
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
afterEach(() => {
|
|
102
|
+
vi.useRealTimers()
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
describe('basic operations', () => {
|
|
106
|
+
it('should acquire a connection when pool is empty', async () => {
|
|
107
|
+
const pool = new DOConnectionPool({
|
|
108
|
+
factory: createMockFactory(),
|
|
109
|
+
maxSize: 5,
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
const conn = await pool.acquire()
|
|
113
|
+
|
|
114
|
+
expect(conn).toBeDefined()
|
|
115
|
+
expect(conn.id).toBe('mock-1')
|
|
116
|
+
expect(pool.size).toBe(1)
|
|
117
|
+
|
|
118
|
+
await pool.close()
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
it('should release connection back to pool', async () => {
|
|
122
|
+
const pool = new DOConnectionPool({
|
|
123
|
+
factory: createMockFactory(),
|
|
124
|
+
maxSize: 5,
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
const conn = await pool.acquire()
|
|
128
|
+
await pool.release(conn)
|
|
129
|
+
|
|
130
|
+
expect(pool.size).toBe(1)
|
|
131
|
+
expect(pool.availableCount).toBe(1)
|
|
132
|
+
|
|
133
|
+
await pool.close()
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
it('should destroy connection without returning to pool', async () => {
|
|
137
|
+
const pool = new DOConnectionPool({
|
|
138
|
+
factory: createMockFactory(),
|
|
139
|
+
maxSize: 5,
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
const conn = await pool.acquire()
|
|
143
|
+
await pool.destroy(conn)
|
|
144
|
+
|
|
145
|
+
expect(pool.size).toBe(0)
|
|
146
|
+
expect(pool.availableCount).toBe(0)
|
|
147
|
+
expect(conn.isClosed).toBe(true)
|
|
148
|
+
|
|
149
|
+
await pool.close()
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
it('should throw when acquiring from closed pool', async () => {
|
|
153
|
+
const pool = new DOConnectionPool({
|
|
154
|
+
factory: createMockFactory(),
|
|
155
|
+
maxSize: 5,
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
await pool.close()
|
|
159
|
+
|
|
160
|
+
await expect(pool.acquire()).rejects.toThrow('Pool is closed')
|
|
161
|
+
})
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
describe('connection reuse', () => {
|
|
165
|
+
it('should reuse released connections', async () => {
|
|
166
|
+
vi.useRealTimers()
|
|
167
|
+
|
|
168
|
+
const pool = new DOConnectionPool({
|
|
169
|
+
factory: createMockFactory(),
|
|
170
|
+
maxSize: 5,
|
|
171
|
+
enableHealthCheck: false,
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
const conn1 = await pool.acquire()
|
|
175
|
+
const conn1Id = conn1.id
|
|
176
|
+
await pool.release(conn1)
|
|
177
|
+
|
|
178
|
+
const conn2 = await pool.acquire()
|
|
179
|
+
|
|
180
|
+
expect(conn2.id).toBe(conn1Id)
|
|
181
|
+
expect(pool.size).toBe(1)
|
|
182
|
+
|
|
183
|
+
await pool.close()
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
it('should create new connection when no idle available', async () => {
|
|
187
|
+
const pool = new DOConnectionPool({
|
|
188
|
+
factory: createMockFactory(),
|
|
189
|
+
maxSize: 5,
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
const conn1 = await pool.acquire()
|
|
193
|
+
const conn2 = await pool.acquire()
|
|
194
|
+
|
|
195
|
+
expect(conn1.id).not.toBe(conn2.id)
|
|
196
|
+
expect(pool.size).toBe(2)
|
|
197
|
+
|
|
198
|
+
await pool.close()
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
it('should track connection use count', async () => {
|
|
202
|
+
vi.useRealTimers()
|
|
203
|
+
|
|
204
|
+
const pool = new DOConnectionPool({
|
|
205
|
+
factory: createMockFactory(),
|
|
206
|
+
maxSize: 5,
|
|
207
|
+
enableHealthCheck: false,
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
const conn1 = await pool.acquire()
|
|
211
|
+
await pool.release(conn1)
|
|
212
|
+
|
|
213
|
+
const conn2 = await pool.acquire()
|
|
214
|
+
await pool.release(conn2)
|
|
215
|
+
|
|
216
|
+
const stats = pool.getConnectionStats()
|
|
217
|
+
expect(stats[0].useCount).toBe(2)
|
|
218
|
+
|
|
219
|
+
await pool.close()
|
|
220
|
+
})
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
describe('max pool size', () => {
|
|
224
|
+
it('should respect max pool size', async () => {
|
|
225
|
+
const pool = new DOConnectionPool({
|
|
226
|
+
factory: createMockFactory(),
|
|
227
|
+
maxSize: 2,
|
|
228
|
+
fairQueue: false,
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
const conn1 = await pool.acquire()
|
|
232
|
+
const conn2 = await pool.acquire()
|
|
233
|
+
|
|
234
|
+
await expect(pool.acquire()).rejects.toThrow('Pool exhausted')
|
|
235
|
+
|
|
236
|
+
await pool.close()
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
it('should queue requests when pool exhausted with fairQueue enabled', async () => {
|
|
240
|
+
vi.useRealTimers()
|
|
241
|
+
|
|
242
|
+
const pool = new DOConnectionPool({
|
|
243
|
+
factory: createMockFactory(),
|
|
244
|
+
maxSize: 1,
|
|
245
|
+
fairQueue: true,
|
|
246
|
+
acquireTimeoutMs: 5000,
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
const conn1 = await pool.acquire()
|
|
250
|
+
|
|
251
|
+
// Start acquiring second connection (should queue)
|
|
252
|
+
const conn2Promise = pool.acquire()
|
|
253
|
+
|
|
254
|
+
// Release first connection after delay
|
|
255
|
+
setTimeout(async () => {
|
|
256
|
+
await pool.release(conn1)
|
|
257
|
+
}, 50)
|
|
258
|
+
|
|
259
|
+
const conn2 = await conn2Promise
|
|
260
|
+
|
|
261
|
+
expect(conn2.id).toBe(conn1.id)
|
|
262
|
+
|
|
263
|
+
await pool.close()
|
|
264
|
+
})
|
|
265
|
+
|
|
266
|
+
it('should timeout when queue wait exceeds timeout', async () => {
|
|
267
|
+
vi.useRealTimers()
|
|
268
|
+
|
|
269
|
+
const pool = new DOConnectionPool({
|
|
270
|
+
factory: createMockFactory(),
|
|
271
|
+
maxSize: 1,
|
|
272
|
+
fairQueue: true,
|
|
273
|
+
acquireTimeoutMs: 50,
|
|
274
|
+
})
|
|
275
|
+
|
|
276
|
+
await pool.acquire()
|
|
277
|
+
|
|
278
|
+
await expect(pool.acquire()).rejects.toThrow('Acquire timeout')
|
|
279
|
+
|
|
280
|
+
await pool.close()
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
it('should enforce max queue size', async () => {
|
|
284
|
+
const pool = new DOConnectionPool({
|
|
285
|
+
factory: createMockFactory(),
|
|
286
|
+
maxSize: 1,
|
|
287
|
+
fairQueue: true,
|
|
288
|
+
maxQueueSize: 1,
|
|
289
|
+
acquireTimeoutMs: 5000,
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
await pool.acquire()
|
|
293
|
+
pool.acquire().catch(() => {}) // First queued request
|
|
294
|
+
|
|
295
|
+
await expect(pool.acquire()).rejects.toThrow('max queue size reached')
|
|
296
|
+
|
|
297
|
+
await pool.close()
|
|
298
|
+
})
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
describe('idle connection timeout', () => {
|
|
302
|
+
it('should close idle connections after timeout', async () => {
|
|
303
|
+
const pool = new DOConnectionPool({
|
|
304
|
+
factory: createMockFactory(),
|
|
305
|
+
maxSize: 5,
|
|
306
|
+
idleTimeoutMs: 100,
|
|
307
|
+
minSize: 0,
|
|
308
|
+
enableHealthCheck: false, // Disable to avoid infinite interval loops
|
|
309
|
+
})
|
|
310
|
+
|
|
311
|
+
const conn = await pool.acquire()
|
|
312
|
+
await pool.release(conn)
|
|
313
|
+
|
|
314
|
+
expect(pool.size).toBe(1)
|
|
315
|
+
|
|
316
|
+
// Fast-forward past idle timeout using async version for single advance
|
|
317
|
+
await vi.advanceTimersByTimeAsync(150)
|
|
318
|
+
|
|
319
|
+
expect(pool.size).toBe(0)
|
|
320
|
+
|
|
321
|
+
await pool.close()
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
it('should not close connections below minSize', async () => {
|
|
325
|
+
vi.useRealTimers()
|
|
326
|
+
|
|
327
|
+
const pool = new DOConnectionPool({
|
|
328
|
+
factory: createMockFactory(),
|
|
329
|
+
maxSize: 5,
|
|
330
|
+
minSize: 1,
|
|
331
|
+
idleTimeoutMs: 50,
|
|
332
|
+
enableHealthCheck: false, // Disable to avoid interval loops
|
|
333
|
+
})
|
|
334
|
+
|
|
335
|
+
const conn = await pool.acquire()
|
|
336
|
+
await pool.release(conn)
|
|
337
|
+
|
|
338
|
+
// Wait for idle timeout to pass
|
|
339
|
+
await new Promise(resolve => setTimeout(resolve, 100))
|
|
340
|
+
|
|
341
|
+
// Connection should still exist due to minSize
|
|
342
|
+
expect(pool.size).toBe(1)
|
|
343
|
+
|
|
344
|
+
await pool.close()
|
|
345
|
+
})
|
|
346
|
+
})
|
|
347
|
+
|
|
348
|
+
describe('health checking', () => {
|
|
349
|
+
it('should reject unhealthy connections on acquire', async () => {
|
|
350
|
+
vi.useRealTimers()
|
|
351
|
+
|
|
352
|
+
const pool = new DOConnectionPool({
|
|
353
|
+
factory: createMockFactory(),
|
|
354
|
+
maxSize: 5,
|
|
355
|
+
enableHealthCheck: true,
|
|
356
|
+
})
|
|
357
|
+
|
|
358
|
+
const conn1 = await pool.acquire()
|
|
359
|
+
conn1.markUnhealthy()
|
|
360
|
+
await pool.release(conn1)
|
|
361
|
+
|
|
362
|
+
// Next acquire should get a new connection (old one is unhealthy)
|
|
363
|
+
const conn2 = await pool.acquire()
|
|
364
|
+
expect(conn2.id).not.toBe(conn1.id)
|
|
365
|
+
|
|
366
|
+
await pool.close()
|
|
367
|
+
})
|
|
368
|
+
|
|
369
|
+
it('should run periodic health checks', async () => {
|
|
370
|
+
vi.useRealTimers()
|
|
371
|
+
|
|
372
|
+
const healthChecker = vi.fn().mockResolvedValue(true)
|
|
373
|
+
|
|
374
|
+
const pool = new DOConnectionPool({
|
|
375
|
+
factory: createMockFactory(),
|
|
376
|
+
maxSize: 5,
|
|
377
|
+
enableHealthCheck: true,
|
|
378
|
+
healthCheckIntervalMs: 50,
|
|
379
|
+
healthChecker,
|
|
380
|
+
})
|
|
381
|
+
|
|
382
|
+
const conn = await pool.acquire()
|
|
383
|
+
await pool.release(conn)
|
|
384
|
+
|
|
385
|
+
// Wait for health check interval to fire
|
|
386
|
+
await new Promise(resolve => setTimeout(resolve, 100))
|
|
387
|
+
|
|
388
|
+
expect(healthChecker).toHaveBeenCalled()
|
|
389
|
+
|
|
390
|
+
await pool.close()
|
|
391
|
+
})
|
|
392
|
+
|
|
393
|
+
it('should remove connections that fail health check', async () => {
|
|
394
|
+
vi.useRealTimers()
|
|
395
|
+
|
|
396
|
+
let healthCheckCount = 0
|
|
397
|
+
const healthChecker: HealthChecker<MockConnection> = async () => {
|
|
398
|
+
healthCheckCount++
|
|
399
|
+
return healthCheckCount === 1 // Pass first, fail second
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
const pool = new DOConnectionPool({
|
|
403
|
+
factory: createMockFactory(),
|
|
404
|
+
maxSize: 5,
|
|
405
|
+
enableHealthCheck: true,
|
|
406
|
+
healthCheckIntervalMs: 50,
|
|
407
|
+
healthChecker,
|
|
408
|
+
minSize: 0,
|
|
409
|
+
})
|
|
410
|
+
|
|
411
|
+
const conn = await pool.acquire()
|
|
412
|
+
await pool.release(conn)
|
|
413
|
+
|
|
414
|
+
expect(pool.size).toBe(1)
|
|
415
|
+
|
|
416
|
+
// Wait for first health check (should pass)
|
|
417
|
+
await new Promise(resolve => setTimeout(resolve, 75))
|
|
418
|
+
|
|
419
|
+
expect(pool.size).toBe(1)
|
|
420
|
+
|
|
421
|
+
// Wait for second health check (should fail)
|
|
422
|
+
await new Promise(resolve => setTimeout(resolve, 75))
|
|
423
|
+
|
|
424
|
+
expect(pool.size).toBe(0)
|
|
425
|
+
|
|
426
|
+
await pool.close()
|
|
427
|
+
})
|
|
428
|
+
|
|
429
|
+
it('should use custom health checker', async () => {
|
|
430
|
+
vi.useRealTimers()
|
|
431
|
+
|
|
432
|
+
const customChecker = vi.fn().mockResolvedValue(true)
|
|
433
|
+
|
|
434
|
+
const pool = new DOConnectionPool({
|
|
435
|
+
factory: createMockFactory(),
|
|
436
|
+
maxSize: 5,
|
|
437
|
+
enableHealthCheck: true,
|
|
438
|
+
healthChecker: customChecker,
|
|
439
|
+
healthCheckIntervalMs: 50,
|
|
440
|
+
})
|
|
441
|
+
|
|
442
|
+
const conn = await pool.acquire()
|
|
443
|
+
await pool.release(conn)
|
|
444
|
+
|
|
445
|
+
// Wait for health check interval to fire
|
|
446
|
+
await new Promise(resolve => setTimeout(resolve, 100))
|
|
447
|
+
|
|
448
|
+
expect(customChecker).toHaveBeenCalledWith(conn)
|
|
449
|
+
|
|
450
|
+
await pool.close()
|
|
451
|
+
})
|
|
452
|
+
})
|
|
453
|
+
|
|
454
|
+
describe('fair queuing', () => {
|
|
455
|
+
it('should process queued requests in FIFO order', async () => {
|
|
456
|
+
vi.useRealTimers()
|
|
457
|
+
|
|
458
|
+
const pool = new DOConnectionPool({
|
|
459
|
+
factory: createMockFactory(),
|
|
460
|
+
maxSize: 1,
|
|
461
|
+
fairQueue: true,
|
|
462
|
+
acquireTimeoutMs: 5000,
|
|
463
|
+
enableHealthCheck: false, // Disable to avoid interval issues
|
|
464
|
+
})
|
|
465
|
+
|
|
466
|
+
const conn1 = await pool.acquire()
|
|
467
|
+
|
|
468
|
+
const order: number[] = []
|
|
469
|
+
const connections: MockConnection[] = []
|
|
470
|
+
|
|
471
|
+
// Queue multiple requests - store connections so we can release them
|
|
472
|
+
const p1 = pool.acquire().then(c => { order.push(1); connections.push(c); return c })
|
|
473
|
+
const p2 = pool.acquire().then(c => { order.push(2); connections.push(c); return c })
|
|
474
|
+
const p3 = pool.acquire().then(c => { order.push(3); connections.push(c); return c })
|
|
475
|
+
|
|
476
|
+
// Give time for requests to queue
|
|
477
|
+
await new Promise(resolve => setTimeout(resolve, 10))
|
|
478
|
+
|
|
479
|
+
// Release initial connection - this triggers p1
|
|
480
|
+
await pool.release(conn1)
|
|
481
|
+
await p1
|
|
482
|
+
|
|
483
|
+
// Release for p2
|
|
484
|
+
if (connections.length > 0) {
|
|
485
|
+
await pool.release(connections[0])
|
|
486
|
+
await p2
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Release for p3
|
|
490
|
+
if (connections.length > 1) {
|
|
491
|
+
await pool.release(connections[1])
|
|
492
|
+
await p3
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Requests should be processed in FIFO order
|
|
496
|
+
expect(order).toEqual([1, 2, 3])
|
|
497
|
+
|
|
498
|
+
await pool.close()
|
|
499
|
+
})
|
|
500
|
+
|
|
501
|
+
it('should handle release to waiting request directly', async () => {
|
|
502
|
+
vi.useRealTimers()
|
|
503
|
+
|
|
504
|
+
const pool = new DOConnectionPool({
|
|
505
|
+
factory: createMockFactory(),
|
|
506
|
+
maxSize: 1,
|
|
507
|
+
fairQueue: true,
|
|
508
|
+
acquireTimeoutMs: 5000,
|
|
509
|
+
enableHealthCheck: false, // Disable to avoid background interval issues
|
|
510
|
+
})
|
|
511
|
+
|
|
512
|
+
const conn1 = await pool.acquire()
|
|
513
|
+
|
|
514
|
+
// Start waiting for second connection (don't await yet)
|
|
515
|
+
const conn2Promise = pool.acquire()
|
|
516
|
+
|
|
517
|
+
// Give microtask queue time to process
|
|
518
|
+
await new Promise(resolve => setTimeout(resolve, 10))
|
|
519
|
+
|
|
520
|
+
// Release should go directly to waiting request
|
|
521
|
+
await pool.release(conn1)
|
|
522
|
+
|
|
523
|
+
const conn2 = await conn2Promise
|
|
524
|
+
|
|
525
|
+
expect(conn2.id).toBe(conn1.id)
|
|
526
|
+
expect(pool.queueLength).toBe(0)
|
|
527
|
+
|
|
528
|
+
await pool.close()
|
|
529
|
+
})
|
|
530
|
+
})
|
|
531
|
+
|
|
532
|
+
describe('high concurrency', () => {
|
|
533
|
+
it('should handle many concurrent acquire requests', async () => {
|
|
534
|
+
vi.useRealTimers()
|
|
535
|
+
|
|
536
|
+
const pool = new DOConnectionPool({
|
|
537
|
+
factory: createMockFactory(5), // 5ms delay for each connection
|
|
538
|
+
maxSize: 10,
|
|
539
|
+
fairQueue: true,
|
|
540
|
+
acquireTimeoutMs: 10000,
|
|
541
|
+
})
|
|
542
|
+
|
|
543
|
+
// Acquire 10 connections concurrently
|
|
544
|
+
const promises = Array(10).fill(null).map(() => pool.acquire())
|
|
545
|
+
const connections = await Promise.all(promises)
|
|
546
|
+
|
|
547
|
+
expect(connections).toHaveLength(10)
|
|
548
|
+
expect(pool.size).toBe(10)
|
|
549
|
+
|
|
550
|
+
// All connections should be unique
|
|
551
|
+
const ids = new Set(connections.map(c => c.id))
|
|
552
|
+
expect(ids.size).toBe(10)
|
|
553
|
+
|
|
554
|
+
await pool.close()
|
|
555
|
+
})
|
|
556
|
+
|
|
557
|
+
it('should handle concurrent acquire and release', async () => {
|
|
558
|
+
vi.useRealTimers()
|
|
559
|
+
|
|
560
|
+
const pool = new DOConnectionPool({
|
|
561
|
+
factory: createMockFactory(),
|
|
562
|
+
maxSize: 5,
|
|
563
|
+
fairQueue: true,
|
|
564
|
+
acquireTimeoutMs: 5000,
|
|
565
|
+
enableHealthCheck: false,
|
|
566
|
+
})
|
|
567
|
+
|
|
568
|
+
// Simulate high-concurrency scenario
|
|
569
|
+
const operations: Promise<void>[] = []
|
|
570
|
+
|
|
571
|
+
for (let i = 0; i < 50; i++) {
|
|
572
|
+
operations.push((async () => {
|
|
573
|
+
const conn = await pool.acquire()
|
|
574
|
+
// Simulate some work
|
|
575
|
+
await new Promise(resolve => setTimeout(resolve, Math.random() * 10))
|
|
576
|
+
await pool.release(conn)
|
|
577
|
+
})())
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
await Promise.all(operations)
|
|
581
|
+
|
|
582
|
+
const metrics = pool.getMetrics()
|
|
583
|
+
expect(metrics.totalAcquisitions).toBe(50)
|
|
584
|
+
expect(metrics.totalReleases).toBe(50)
|
|
585
|
+
|
|
586
|
+
await pool.close()
|
|
587
|
+
})
|
|
588
|
+
|
|
589
|
+
it('should handle acquire timeout under load', async () => {
|
|
590
|
+
vi.useRealTimers()
|
|
591
|
+
|
|
592
|
+
const pool = new DOConnectionPool({
|
|
593
|
+
factory: createMockFactory(100), // Slow connection creation
|
|
594
|
+
maxSize: 2,
|
|
595
|
+
fairQueue: true,
|
|
596
|
+
acquireTimeoutMs: 50,
|
|
597
|
+
})
|
|
598
|
+
|
|
599
|
+
// Fill the pool
|
|
600
|
+
const conn1 = await pool.acquire()
|
|
601
|
+
const conn2 = await pool.acquire()
|
|
602
|
+
|
|
603
|
+
// Next acquire should timeout
|
|
604
|
+
const startTime = Date.now()
|
|
605
|
+
await expect(pool.acquire()).rejects.toThrow('timeout')
|
|
606
|
+
const elapsed = Date.now() - startTime
|
|
607
|
+
|
|
608
|
+
expect(elapsed).toBeGreaterThanOrEqual(40) // Allow some tolerance
|
|
609
|
+
expect(elapsed).toBeLessThan(150)
|
|
610
|
+
|
|
611
|
+
await pool.close()
|
|
612
|
+
})
|
|
613
|
+
|
|
614
|
+
it('should track timeout metrics', async () => {
|
|
615
|
+
vi.useRealTimers()
|
|
616
|
+
|
|
617
|
+
const pool = new DOConnectionPool({
|
|
618
|
+
factory: createMockFactory(),
|
|
619
|
+
maxSize: 1,
|
|
620
|
+
fairQueue: true,
|
|
621
|
+
acquireTimeoutMs: 20,
|
|
622
|
+
})
|
|
623
|
+
|
|
624
|
+
await pool.acquire()
|
|
625
|
+
|
|
626
|
+
// Try to acquire more (should timeout)
|
|
627
|
+
const promises = [
|
|
628
|
+
pool.acquire().catch(() => {}),
|
|
629
|
+
pool.acquire().catch(() => {}),
|
|
630
|
+
]
|
|
631
|
+
|
|
632
|
+
await Promise.all(promises)
|
|
633
|
+
|
|
634
|
+
const metrics = pool.getMetrics()
|
|
635
|
+
expect(metrics.totalTimeouts).toBe(2)
|
|
636
|
+
|
|
637
|
+
await pool.close()
|
|
638
|
+
})
|
|
639
|
+
})
|
|
640
|
+
|
|
641
|
+
describe('pool metrics', () => {
|
|
642
|
+
it('should track basic metrics', async () => {
|
|
643
|
+
vi.useRealTimers()
|
|
644
|
+
|
|
645
|
+
const pool = new DOConnectionPool({
|
|
646
|
+
factory: createMockFactory(),
|
|
647
|
+
maxSize: 5,
|
|
648
|
+
enableHealthCheck: false,
|
|
649
|
+
})
|
|
650
|
+
|
|
651
|
+
const conn1 = await pool.acquire()
|
|
652
|
+
const conn2 = await pool.acquire()
|
|
653
|
+
await pool.release(conn1)
|
|
654
|
+
|
|
655
|
+
const metrics = pool.getMetrics()
|
|
656
|
+
|
|
657
|
+
expect(metrics.totalCreated).toBe(2)
|
|
658
|
+
expect(metrics.currentSize).toBe(2)
|
|
659
|
+
expect(metrics.inUse).toBe(1)
|
|
660
|
+
expect(metrics.available).toBe(1)
|
|
661
|
+
expect(metrics.totalAcquisitions).toBe(2)
|
|
662
|
+
expect(metrics.totalReleases).toBe(1)
|
|
663
|
+
|
|
664
|
+
await pool.close()
|
|
665
|
+
})
|
|
666
|
+
|
|
667
|
+
it('should calculate utilization percentage', async () => {
|
|
668
|
+
const pool = new DOConnectionPool({
|
|
669
|
+
factory: createMockFactory(),
|
|
670
|
+
maxSize: 5,
|
|
671
|
+
})
|
|
672
|
+
|
|
673
|
+
const conn1 = await pool.acquire()
|
|
674
|
+
const conn2 = await pool.acquire()
|
|
675
|
+
|
|
676
|
+
let metrics = pool.getMetrics()
|
|
677
|
+
expect(metrics.utilizationPercent).toBe(100) // 2/2 = 100%
|
|
678
|
+
|
|
679
|
+
await pool.release(conn1)
|
|
680
|
+
|
|
681
|
+
metrics = pool.getMetrics()
|
|
682
|
+
expect(metrics.utilizationPercent).toBe(50) // 1/2 = 50%
|
|
683
|
+
|
|
684
|
+
await pool.close()
|
|
685
|
+
})
|
|
686
|
+
|
|
687
|
+
it('should track wait times', async () => {
|
|
688
|
+
vi.useRealTimers()
|
|
689
|
+
|
|
690
|
+
const pool = new DOConnectionPool({
|
|
691
|
+
factory: createMockFactory(50), // 50ms delay
|
|
692
|
+
maxSize: 5,
|
|
693
|
+
})
|
|
694
|
+
|
|
695
|
+
await pool.acquire()
|
|
696
|
+
await pool.acquire()
|
|
697
|
+
|
|
698
|
+
const metrics = pool.getMetrics()
|
|
699
|
+
expect(metrics.avgWaitTimeMs).toBeGreaterThan(0)
|
|
700
|
+
|
|
701
|
+
await pool.close()
|
|
702
|
+
})
|
|
703
|
+
|
|
704
|
+
it('should track health check metrics', async () => {
|
|
705
|
+
vi.useRealTimers()
|
|
706
|
+
|
|
707
|
+
const healthChecker = vi.fn()
|
|
708
|
+
.mockResolvedValueOnce(true)
|
|
709
|
+
.mockResolvedValueOnce(false)
|
|
710
|
+
|
|
711
|
+
const pool = new DOConnectionPool({
|
|
712
|
+
factory: createMockFactory(),
|
|
713
|
+
maxSize: 5,
|
|
714
|
+
enableHealthCheck: true,
|
|
715
|
+
healthCheckIntervalMs: 30,
|
|
716
|
+
healthChecker,
|
|
717
|
+
minSize: 0,
|
|
718
|
+
})
|
|
719
|
+
|
|
720
|
+
const conn = await pool.acquire()
|
|
721
|
+
await pool.release(conn)
|
|
722
|
+
|
|
723
|
+
// Wait for health checks to run
|
|
724
|
+
await new Promise(resolve => setTimeout(resolve, 50))
|
|
725
|
+
await new Promise(resolve => setTimeout(resolve, 50))
|
|
726
|
+
|
|
727
|
+
const metrics = pool.getMetrics()
|
|
728
|
+
expect(metrics.totalHealthChecks).toBeGreaterThanOrEqual(1)
|
|
729
|
+
expect(metrics.totalHealthCheckFailures).toBeGreaterThanOrEqual(1)
|
|
730
|
+
|
|
731
|
+
await pool.close()
|
|
732
|
+
})
|
|
733
|
+
|
|
734
|
+
it('should track queue length', async () => {
|
|
735
|
+
vi.useRealTimers()
|
|
736
|
+
|
|
737
|
+
const pool = new DOConnectionPool({
|
|
738
|
+
factory: createMockFactory(),
|
|
739
|
+
maxSize: 1,
|
|
740
|
+
fairQueue: true,
|
|
741
|
+
acquireTimeoutMs: 5000,
|
|
742
|
+
})
|
|
743
|
+
|
|
744
|
+
await pool.acquire()
|
|
745
|
+
|
|
746
|
+
// Queue some requests
|
|
747
|
+
pool.acquire().catch(() => {})
|
|
748
|
+
pool.acquire().catch(() => {})
|
|
749
|
+
|
|
750
|
+
// Allow microtask queue to process
|
|
751
|
+
await new Promise(resolve => setTimeout(resolve, 0))
|
|
752
|
+
|
|
753
|
+
const metrics = pool.getMetrics()
|
|
754
|
+
expect(metrics.queueLength).toBe(2)
|
|
755
|
+
expect(metrics.pendingRequests).toBe(2)
|
|
756
|
+
|
|
757
|
+
await pool.close()
|
|
758
|
+
})
|
|
759
|
+
})
|
|
760
|
+
|
|
761
|
+
describe('connection stats', () => {
|
|
762
|
+
it('should provide per-connection statistics', async () => {
|
|
763
|
+
vi.useRealTimers()
|
|
764
|
+
|
|
765
|
+
const pool = new DOConnectionPool({
|
|
766
|
+
factory: createMockFactory(),
|
|
767
|
+
maxSize: 5,
|
|
768
|
+
enableHealthCheck: false,
|
|
769
|
+
})
|
|
770
|
+
|
|
771
|
+
const conn = await pool.acquire()
|
|
772
|
+
await pool.release(conn)
|
|
773
|
+
await pool.acquire()
|
|
774
|
+
|
|
775
|
+
const stats = pool.getConnectionStats()
|
|
776
|
+
|
|
777
|
+
expect(stats).toHaveLength(1)
|
|
778
|
+
expect(stats[0].id).toBe(conn.id)
|
|
779
|
+
expect(stats[0].useCount).toBe(2)
|
|
780
|
+
expect(stats[0].createdAt).toBeDefined()
|
|
781
|
+
expect(stats[0].lastUsedAt).toBeDefined()
|
|
782
|
+
|
|
783
|
+
await pool.close()
|
|
784
|
+
})
|
|
785
|
+
})
|
|
786
|
+
|
|
787
|
+
describe('minimum pool size', () => {
|
|
788
|
+
it('should maintain minimum connections after destroy', async () => {
|
|
789
|
+
vi.useRealTimers()
|
|
790
|
+
|
|
791
|
+
const pool = new DOConnectionPool({
|
|
792
|
+
factory: createMockFactory(),
|
|
793
|
+
maxSize: 5,
|
|
794
|
+
minSize: 2,
|
|
795
|
+
warmOnStart: true,
|
|
796
|
+
warmCount: 2,
|
|
797
|
+
enableHealthCheck: false, // Disable to avoid interval issues
|
|
798
|
+
})
|
|
799
|
+
|
|
800
|
+
// Initialize with min size
|
|
801
|
+
await pool.initialize()
|
|
802
|
+
|
|
803
|
+
expect(pool.size).toBeGreaterThanOrEqual(2)
|
|
804
|
+
|
|
805
|
+
// Destroy a connection
|
|
806
|
+
const conn = await pool.acquire()
|
|
807
|
+
await pool.destroy(conn)
|
|
808
|
+
|
|
809
|
+
// Should create new connection to maintain min size (ensureMinSize is called in destroy)
|
|
810
|
+
// Give async operations time to complete
|
|
811
|
+
await new Promise(resolve => setTimeout(resolve, 50))
|
|
812
|
+
|
|
813
|
+
expect(pool.size).toBeGreaterThanOrEqual(1)
|
|
814
|
+
|
|
815
|
+
await pool.close()
|
|
816
|
+
})
|
|
817
|
+
})
|
|
818
|
+
|
|
819
|
+
describe('warm start', () => {
|
|
820
|
+
it('should warm connections on initialize', async () => {
|
|
821
|
+
const pool = new DOConnectionPool({
|
|
822
|
+
factory: createMockFactory(),
|
|
823
|
+
maxSize: 10,
|
|
824
|
+
warmOnStart: true,
|
|
825
|
+
warmCount: 3,
|
|
826
|
+
})
|
|
827
|
+
|
|
828
|
+
await pool.initialize()
|
|
829
|
+
|
|
830
|
+
expect(pool.size).toBe(3)
|
|
831
|
+
expect(pool.availableCount).toBe(3)
|
|
832
|
+
|
|
833
|
+
await pool.close()
|
|
834
|
+
})
|
|
835
|
+
|
|
836
|
+
it('should respect maxSize during warm start', async () => {
|
|
837
|
+
const pool = new DOConnectionPool({
|
|
838
|
+
factory: createMockFactory(),
|
|
839
|
+
maxSize: 2,
|
|
840
|
+
warmOnStart: true,
|
|
841
|
+
warmCount: 5,
|
|
842
|
+
})
|
|
843
|
+
|
|
844
|
+
await pool.initialize()
|
|
845
|
+
|
|
846
|
+
expect(pool.size).toBe(2)
|
|
847
|
+
|
|
848
|
+
await pool.close()
|
|
849
|
+
})
|
|
850
|
+
|
|
851
|
+
it('should handle warm start failures gracefully', async () => {
|
|
852
|
+
const pool = new DOConnectionPool({
|
|
853
|
+
factory: createFailingFactory(2),
|
|
854
|
+
maxSize: 5,
|
|
855
|
+
warmOnStart: true,
|
|
856
|
+
warmCount: 3,
|
|
857
|
+
})
|
|
858
|
+
|
|
859
|
+
// Should not throw
|
|
860
|
+
await pool.initialize()
|
|
861
|
+
|
|
862
|
+
// Only 1 connection should have succeeded
|
|
863
|
+
expect(pool.size).toBe(1)
|
|
864
|
+
|
|
865
|
+
await pool.close()
|
|
866
|
+
})
|
|
867
|
+
})
|
|
868
|
+
|
|
869
|
+
describe('auto scaling', () => {
|
|
870
|
+
it('should scale up when utilization exceeds threshold', async () => {
|
|
871
|
+
vi.useRealTimers()
|
|
872
|
+
|
|
873
|
+
const pool = new DOConnectionPool({
|
|
874
|
+
factory: createMockFactory(),
|
|
875
|
+
maxSize: 10,
|
|
876
|
+
minSize: 1,
|
|
877
|
+
autoScale: true,
|
|
878
|
+
scaleUpThreshold: 0.5,
|
|
879
|
+
healthCheckIntervalMs: 50,
|
|
880
|
+
warmOnStart: true,
|
|
881
|
+
warmCount: 1,
|
|
882
|
+
})
|
|
883
|
+
|
|
884
|
+
// Start with one connection
|
|
885
|
+
await pool.initialize()
|
|
886
|
+
const conn = await pool.acquire()
|
|
887
|
+
|
|
888
|
+
// Utilization is now 100%, above threshold
|
|
889
|
+
// Wait for auto-scale check interval to fire
|
|
890
|
+
await new Promise(resolve => setTimeout(resolve, 100))
|
|
891
|
+
|
|
892
|
+
// Should have scaled up
|
|
893
|
+
expect(pool.size).toBeGreaterThanOrEqual(1)
|
|
894
|
+
|
|
895
|
+
await pool.close()
|
|
896
|
+
})
|
|
897
|
+
})
|
|
898
|
+
|
|
899
|
+
describe('pool closure', () => {
|
|
900
|
+
it('should reject pending requests on close', async () => {
|
|
901
|
+
vi.useRealTimers()
|
|
902
|
+
|
|
903
|
+
const pool = new DOConnectionPool({
|
|
904
|
+
factory: createMockFactory(),
|
|
905
|
+
maxSize: 1,
|
|
906
|
+
fairQueue: true,
|
|
907
|
+
acquireTimeoutMs: 5000,
|
|
908
|
+
enableHealthCheck: false, // Disable to avoid interval issues
|
|
909
|
+
})
|
|
910
|
+
|
|
911
|
+
await pool.acquire()
|
|
912
|
+
|
|
913
|
+
const pendingPromise = pool.acquire()
|
|
914
|
+
|
|
915
|
+
// Give time for the request to be queued
|
|
916
|
+
await new Promise(resolve => setTimeout(resolve, 10))
|
|
917
|
+
|
|
918
|
+
await pool.close()
|
|
919
|
+
|
|
920
|
+
await expect(pendingPromise).rejects.toThrow('Pool closed')
|
|
921
|
+
})
|
|
922
|
+
|
|
923
|
+
it('should close all connections on pool close', async () => {
|
|
924
|
+
const pool = new DOConnectionPool({
|
|
925
|
+
factory: createMockFactory(),
|
|
926
|
+
maxSize: 5,
|
|
927
|
+
})
|
|
928
|
+
|
|
929
|
+
const connections = await Promise.all([
|
|
930
|
+
pool.acquire(),
|
|
931
|
+
pool.acquire(),
|
|
932
|
+
pool.acquire(),
|
|
933
|
+
])
|
|
934
|
+
|
|
935
|
+
await pool.close()
|
|
936
|
+
|
|
937
|
+
for (const conn of connections) {
|
|
938
|
+
expect(conn.isClosed).toBe(true)
|
|
939
|
+
}
|
|
940
|
+
})
|
|
941
|
+
|
|
942
|
+
it('should release connection to closed pool gracefully', async () => {
|
|
943
|
+
const pool = new DOConnectionPool({
|
|
944
|
+
factory: createMockFactory(),
|
|
945
|
+
maxSize: 5,
|
|
946
|
+
})
|
|
947
|
+
|
|
948
|
+
const conn = await pool.acquire()
|
|
949
|
+
await pool.close()
|
|
950
|
+
|
|
951
|
+
// Should not throw
|
|
952
|
+
await pool.release(conn)
|
|
953
|
+
expect(conn.isClosed).toBe(true)
|
|
954
|
+
})
|
|
955
|
+
})
|
|
956
|
+
|
|
957
|
+
describe('error handling', () => {
|
|
958
|
+
it('should handle factory errors', async () => {
|
|
959
|
+
const failingFactory = vi.fn().mockRejectedValue(new Error('Factory error'))
|
|
960
|
+
|
|
961
|
+
const pool = new DOConnectionPool({
|
|
962
|
+
factory: failingFactory,
|
|
963
|
+
maxSize: 5,
|
|
964
|
+
fairQueue: false,
|
|
965
|
+
})
|
|
966
|
+
|
|
967
|
+
await expect(pool.acquire()).rejects.toThrow('Factory error')
|
|
968
|
+
|
|
969
|
+
await pool.close()
|
|
970
|
+
})
|
|
971
|
+
|
|
972
|
+
it('should handle connection close errors gracefully', async () => {
|
|
973
|
+
vi.useRealTimers()
|
|
974
|
+
|
|
975
|
+
const factory: ConnectionFactory<MockConnection> = async () => {
|
|
976
|
+
const conn = new MockConnection(`mock-${++connectionIdCounter}`)
|
|
977
|
+
conn.closeDelay = 10
|
|
978
|
+
const originalClose = conn.close.bind(conn)
|
|
979
|
+
conn.close = async () => {
|
|
980
|
+
await originalClose()
|
|
981
|
+
throw new Error('Close error')
|
|
982
|
+
}
|
|
983
|
+
return conn
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
const pool = new DOConnectionPool({
|
|
987
|
+
factory,
|
|
988
|
+
maxSize: 5,
|
|
989
|
+
enableHealthCheck: false, // Disable to avoid interval issues
|
|
990
|
+
})
|
|
991
|
+
|
|
992
|
+
const conn = await pool.acquire()
|
|
993
|
+
|
|
994
|
+
// Should not throw
|
|
995
|
+
await pool.destroy(conn)
|
|
996
|
+
|
|
997
|
+
await pool.close()
|
|
998
|
+
})
|
|
999
|
+
|
|
1000
|
+
it('should handle validation timeout', async () => {
|
|
1001
|
+
vi.useRealTimers()
|
|
1002
|
+
|
|
1003
|
+
const slowHealthChecker: HealthChecker<MockConnection> = async () => {
|
|
1004
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
1005
|
+
return true
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
const pool = new DOConnectionPool({
|
|
1009
|
+
factory: createMockFactory(),
|
|
1010
|
+
maxSize: 5,
|
|
1011
|
+
enableHealthCheck: true,
|
|
1012
|
+
healthChecker: slowHealthChecker,
|
|
1013
|
+
validationTimeoutMs: 50,
|
|
1014
|
+
})
|
|
1015
|
+
|
|
1016
|
+
const conn = await pool.acquire()
|
|
1017
|
+
conn.markHealthy()
|
|
1018
|
+
await pool.release(conn)
|
|
1019
|
+
|
|
1020
|
+
// Try to acquire - validation should timeout
|
|
1021
|
+
const conn2 = await pool.acquire()
|
|
1022
|
+
|
|
1023
|
+
// Should get a new connection since validation timed out
|
|
1024
|
+
expect(conn2.id).not.toBe(conn.id)
|
|
1025
|
+
|
|
1026
|
+
await pool.close()
|
|
1027
|
+
})
|
|
1028
|
+
})
|
|
1029
|
+
|
|
1030
|
+
describe('load testing', () => {
|
|
1031
|
+
it('should handle sustained load', async () => {
|
|
1032
|
+
vi.useRealTimers()
|
|
1033
|
+
|
|
1034
|
+
const pool = new DOConnectionPool({
|
|
1035
|
+
factory: createMockFactory(),
|
|
1036
|
+
maxSize: 5,
|
|
1037
|
+
fairQueue: true,
|
|
1038
|
+
acquireTimeoutMs: 5000,
|
|
1039
|
+
enableHealthCheck: false,
|
|
1040
|
+
})
|
|
1041
|
+
|
|
1042
|
+
const iterations = 100
|
|
1043
|
+
let completed = 0
|
|
1044
|
+
const errors: Error[] = []
|
|
1045
|
+
|
|
1046
|
+
const worker = async () => {
|
|
1047
|
+
for (let i = 0; i < iterations / 10; i++) {
|
|
1048
|
+
try {
|
|
1049
|
+
const conn = await pool.acquire()
|
|
1050
|
+
await new Promise(resolve => setTimeout(resolve, Math.random() * 5))
|
|
1051
|
+
await pool.release(conn)
|
|
1052
|
+
completed++
|
|
1053
|
+
} catch (e) {
|
|
1054
|
+
errors.push(e as Error)
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
// Run 10 concurrent workers
|
|
1060
|
+
await Promise.all(Array(10).fill(null).map(() => worker()))
|
|
1061
|
+
|
|
1062
|
+
expect(completed).toBe(iterations)
|
|
1063
|
+
expect(errors).toHaveLength(0)
|
|
1064
|
+
|
|
1065
|
+
const metrics = pool.getMetrics()
|
|
1066
|
+
expect(metrics.totalAcquisitions).toBe(iterations)
|
|
1067
|
+
expect(metrics.totalReleases).toBe(iterations)
|
|
1068
|
+
|
|
1069
|
+
await pool.close()
|
|
1070
|
+
})
|
|
1071
|
+
|
|
1072
|
+
it('should maintain fairness under load', async () => {
|
|
1073
|
+
vi.useRealTimers()
|
|
1074
|
+
|
|
1075
|
+
const pool = new DOConnectionPool({
|
|
1076
|
+
factory: createMockFactory(),
|
|
1077
|
+
maxSize: 1,
|
|
1078
|
+
fairQueue: true,
|
|
1079
|
+
acquireTimeoutMs: 10000,
|
|
1080
|
+
enableHealthCheck: false, // Disable to avoid interval issues
|
|
1081
|
+
})
|
|
1082
|
+
|
|
1083
|
+
const conn = await pool.acquire()
|
|
1084
|
+
const acquisitionOrder: number[] = []
|
|
1085
|
+
|
|
1086
|
+
// Queue requests
|
|
1087
|
+
const promises = [1, 2, 3, 4, 5].map(n =>
|
|
1088
|
+
pool.acquire().then(c => {
|
|
1089
|
+
acquisitionOrder.push(n)
|
|
1090
|
+
// Immediately release for next request
|
|
1091
|
+
return pool.release(c)
|
|
1092
|
+
})
|
|
1093
|
+
)
|
|
1094
|
+
|
|
1095
|
+
// Give time for requests to queue
|
|
1096
|
+
await new Promise(resolve => setTimeout(resolve, 10))
|
|
1097
|
+
|
|
1098
|
+
// Release initial connection to start processing queue
|
|
1099
|
+
await pool.release(conn)
|
|
1100
|
+
|
|
1101
|
+
await Promise.all(promises)
|
|
1102
|
+
|
|
1103
|
+
// Requests should be processed in FIFO order
|
|
1104
|
+
expect(acquisitionOrder).toEqual([1, 2, 3, 4, 5])
|
|
1105
|
+
|
|
1106
|
+
await pool.close()
|
|
1107
|
+
})
|
|
1108
|
+
})
|
|
1109
|
+
})
|