@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,1039 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bulk Migration Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates large-scale migrations across many Durable Object instances.
|
|
5
|
+
* When migrating existing user DOs to a new schema version, this provides
|
|
6
|
+
* batch processing, concurrency control, retry logic, and rollback coordination.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Queue-based migration dispatch using Cloudflare Queues
|
|
10
|
+
* - Batch processing with configurable concurrency limits
|
|
11
|
+
* - Automatic retry logic for failed migrations
|
|
12
|
+
* - Coordinated rollback across multiple DOs
|
|
13
|
+
* - Progress tracking and status monitoring
|
|
14
|
+
*
|
|
15
|
+
* @module migrations/bulk-orchestrator
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { Migration, QueryExecutor } from './types'
|
|
19
|
+
import type { MigrationRegistry } from './registry'
|
|
20
|
+
import { createLogger, LogLevel, type ILogger } from '@dotdo/postgres-shared'
|
|
21
|
+
|
|
22
|
+
// Re-export batch types for external use
|
|
23
|
+
export type { BatchMigrationResult, BatchRollbackResult } from './types'
|
|
24
|
+
|
|
25
|
+
// Module-level logger for BulkMigrationOrchestrator
|
|
26
|
+
// Level is DEBUG because the debug config flag gates whether log() is called at all.
|
|
27
|
+
// The logger just provides structured output - the filtering happens at call site.
|
|
28
|
+
const bulkOrchestratorLogger: ILogger = createLogger({
|
|
29
|
+
level: LogLevel.DEBUG,
|
|
30
|
+
prefix: '[BulkMigrationOrchestrator]',
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Selector for targeting DOs to migrate
|
|
35
|
+
*/
|
|
36
|
+
export interface DOSelector {
|
|
37
|
+
/**
|
|
38
|
+
* Filter by DO ID prefix (e.g., 'user_')
|
|
39
|
+
*/
|
|
40
|
+
idPrefix?: string
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Filter by DO IDs (explicit list)
|
|
44
|
+
*/
|
|
45
|
+
ids?: string[]
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Maximum number of DOs to select
|
|
49
|
+
*/
|
|
50
|
+
limit?: number
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Custom filter function
|
|
54
|
+
*/
|
|
55
|
+
filter?: (id: string) => boolean
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Migration job status
|
|
60
|
+
*/
|
|
61
|
+
export type MigrationJobStatus =
|
|
62
|
+
| 'pending'
|
|
63
|
+
| 'queued'
|
|
64
|
+
| 'running'
|
|
65
|
+
| 'completed'
|
|
66
|
+
| 'failed'
|
|
67
|
+
| 'retrying'
|
|
68
|
+
| 'rolled_back'
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Individual DO migration job
|
|
72
|
+
*/
|
|
73
|
+
export interface DOBulkMigrationJob {
|
|
74
|
+
/** Unique job ID */
|
|
75
|
+
jobId: string
|
|
76
|
+
|
|
77
|
+
/** Migration ID being applied */
|
|
78
|
+
migrationId: string
|
|
79
|
+
|
|
80
|
+
/** DO ID to migrate */
|
|
81
|
+
doId: string
|
|
82
|
+
|
|
83
|
+
/** Current job status */
|
|
84
|
+
status: MigrationJobStatus
|
|
85
|
+
|
|
86
|
+
/** Number of retry attempts */
|
|
87
|
+
retryCount: number
|
|
88
|
+
|
|
89
|
+
/** Maximum retry attempts */
|
|
90
|
+
maxRetries: number
|
|
91
|
+
|
|
92
|
+
/** Error message if failed */
|
|
93
|
+
error?: string
|
|
94
|
+
|
|
95
|
+
/** When the job was created */
|
|
96
|
+
createdAt: Date
|
|
97
|
+
|
|
98
|
+
/** When the job was last updated */
|
|
99
|
+
updatedAt: Date
|
|
100
|
+
|
|
101
|
+
/** When the job completed (success or failure) */
|
|
102
|
+
completedAt?: Date
|
|
103
|
+
|
|
104
|
+
/** Execution time in milliseconds */
|
|
105
|
+
executionTimeMs?: number
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Bulk migration batch
|
|
110
|
+
*/
|
|
111
|
+
export interface MigrationBatch {
|
|
112
|
+
/** Batch ID */
|
|
113
|
+
batchId: string
|
|
114
|
+
|
|
115
|
+
/** Migration ID */
|
|
116
|
+
migrationId: string
|
|
117
|
+
|
|
118
|
+
/** Jobs in this batch */
|
|
119
|
+
jobs: DOBulkMigrationJob[]
|
|
120
|
+
|
|
121
|
+
/** Total jobs in batch */
|
|
122
|
+
totalJobs: number
|
|
123
|
+
|
|
124
|
+
/** Completed jobs */
|
|
125
|
+
completedJobs: number
|
|
126
|
+
|
|
127
|
+
/** Failed jobs */
|
|
128
|
+
failedJobs: number
|
|
129
|
+
|
|
130
|
+
/** When the batch started */
|
|
131
|
+
startedAt: Date
|
|
132
|
+
|
|
133
|
+
/** When the batch completed */
|
|
134
|
+
completedAt?: Date
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Bulk migration progress
|
|
139
|
+
*/
|
|
140
|
+
export interface BulkMigrationProgress {
|
|
141
|
+
/** Migration ID */
|
|
142
|
+
migrationId: string
|
|
143
|
+
|
|
144
|
+
/** Total DOs to migrate */
|
|
145
|
+
total: number
|
|
146
|
+
|
|
147
|
+
/** Successfully migrated */
|
|
148
|
+
completed: number
|
|
149
|
+
|
|
150
|
+
/** Failed migrations */
|
|
151
|
+
failed: number
|
|
152
|
+
|
|
153
|
+
/** Currently running */
|
|
154
|
+
running: number
|
|
155
|
+
|
|
156
|
+
/** Queued for processing */
|
|
157
|
+
queued: number
|
|
158
|
+
|
|
159
|
+
/** Overall progress percentage (0-100) */
|
|
160
|
+
progressPercent: number
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Cloudflare Queue message for migration dispatch
|
|
165
|
+
*/
|
|
166
|
+
export interface MigrationQueueMessage {
|
|
167
|
+
/** Message type */
|
|
168
|
+
type: 'migrate' | 'rollback' | 'retry'
|
|
169
|
+
|
|
170
|
+
/** Migration ID */
|
|
171
|
+
migrationId: string
|
|
172
|
+
|
|
173
|
+
/** DO ID to process */
|
|
174
|
+
doId: string
|
|
175
|
+
|
|
176
|
+
/** Job ID for tracking */
|
|
177
|
+
jobId: string
|
|
178
|
+
|
|
179
|
+
/** Retry attempt number */
|
|
180
|
+
retryAttempt: number
|
|
181
|
+
|
|
182
|
+
/** Batch ID for coordination */
|
|
183
|
+
batchId: string
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Bulk migration orchestrator configuration
|
|
188
|
+
*/
|
|
189
|
+
export interface BulkOrchestratorConfig {
|
|
190
|
+
/**
|
|
191
|
+
* Migration registry
|
|
192
|
+
*/
|
|
193
|
+
registry: MigrationRegistry
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Cloudflare Queue binding for dispatching migrations
|
|
197
|
+
*/
|
|
198
|
+
queue?: Queue<MigrationQueueMessage>
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Maximum number of concurrent migrations
|
|
202
|
+
* Default: 10
|
|
203
|
+
*/
|
|
204
|
+
concurrency?: number
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Maximum retry attempts for failed migrations
|
|
208
|
+
* Default: 3
|
|
209
|
+
*/
|
|
210
|
+
maxRetries?: number
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Retry delay in milliseconds
|
|
214
|
+
* Default: 1000 (1 second)
|
|
215
|
+
*/
|
|
216
|
+
retryDelayMs?: number
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Batch size for processing
|
|
220
|
+
* Default: 100
|
|
221
|
+
*/
|
|
222
|
+
batchSize?: number
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Storage for job state (KV, DO, etc.)
|
|
226
|
+
*/
|
|
227
|
+
storage?: BulkMigrationStorage
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Enable debug logging
|
|
231
|
+
* Default: false
|
|
232
|
+
*/
|
|
233
|
+
debug?: boolean
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Storage interface for bulk migration state
|
|
238
|
+
*/
|
|
239
|
+
export interface BulkMigrationStorage {
|
|
240
|
+
/**
|
|
241
|
+
* Get a migration job by ID
|
|
242
|
+
*/
|
|
243
|
+
getJob(jobId: string): Promise<DOBulkMigrationJob | null>
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Save a migration job
|
|
247
|
+
*/
|
|
248
|
+
saveJob(job: DOBulkMigrationJob): Promise<void>
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Get all jobs for a migration
|
|
252
|
+
*/
|
|
253
|
+
getJobsForMigration(migrationId: string): Promise<DOBulkMigrationJob[]>
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Get batch by ID
|
|
257
|
+
*/
|
|
258
|
+
getBatch(batchId: string): Promise<MigrationBatch | null>
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Save batch
|
|
262
|
+
*/
|
|
263
|
+
saveBatch(batch: MigrationBatch): Promise<void>
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Delete job
|
|
267
|
+
*/
|
|
268
|
+
deleteJob(jobId: string): Promise<void>
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* In-memory storage implementation (for testing/development)
|
|
273
|
+
*/
|
|
274
|
+
export class InMemoryBulkMigrationStorage implements BulkMigrationStorage {
|
|
275
|
+
private jobs: Map<string, DOBulkMigrationJob> = new Map()
|
|
276
|
+
private batches: Map<string, MigrationBatch> = new Map()
|
|
277
|
+
|
|
278
|
+
async getJob(jobId: string): Promise<DOBulkMigrationJob | null> {
|
|
279
|
+
return this.jobs.get(jobId) ?? null
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async saveJob(job: DOBulkMigrationJob): Promise<void> {
|
|
283
|
+
this.jobs.set(job.jobId, job)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async getJobsForMigration(migrationId: string): Promise<DOBulkMigrationJob[]> {
|
|
287
|
+
return Array.from(this.jobs.values()).filter((job) => job.migrationId === migrationId)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
async getBatch(batchId: string): Promise<MigrationBatch | null> {
|
|
291
|
+
return this.batches.get(batchId) ?? null
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
async saveBatch(batch: MigrationBatch): Promise<void> {
|
|
295
|
+
this.batches.set(batch.batchId, batch)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
async deleteJob(jobId: string): Promise<void> {
|
|
299
|
+
this.jobs.delete(jobId)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Clear all data (for testing)
|
|
304
|
+
*/
|
|
305
|
+
clear(): void {
|
|
306
|
+
this.jobs.clear()
|
|
307
|
+
this.batches.clear()
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Generate a unique ID
|
|
313
|
+
*/
|
|
314
|
+
function generateId(prefix: string): string {
|
|
315
|
+
const timestamp = Date.now().toString(36)
|
|
316
|
+
const random = Math.random().toString(36).substring(2, 10)
|
|
317
|
+
return `${prefix}_${timestamp}_${random}`
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Bulk Migration Orchestrator
|
|
322
|
+
*
|
|
323
|
+
* Coordinates migrations across many Durable Object instances.
|
|
324
|
+
*
|
|
325
|
+
* @example
|
|
326
|
+
* ```typescript
|
|
327
|
+
* const orchestrator = new BulkMigrationOrchestrator({
|
|
328
|
+
* registry: migrationRegistry,
|
|
329
|
+
* queue: env.MIGRATION_QUEUE,
|
|
330
|
+
* concurrency: 20,
|
|
331
|
+
* maxRetries: 3,
|
|
332
|
+
* })
|
|
333
|
+
*
|
|
334
|
+
* // Schedule migration for all user DOs
|
|
335
|
+
* const batch = await orchestrator.scheduleMigration('0005_add_field', {
|
|
336
|
+
* idPrefix: 'user_',
|
|
337
|
+
* })
|
|
338
|
+
*
|
|
339
|
+
* // Check progress
|
|
340
|
+
* const progress = await orchestrator.getProgress('0005_add_field')
|
|
341
|
+
* console.log(`Progress: ${progress.progressPercent}%`)
|
|
342
|
+
*
|
|
343
|
+
* // Retry failed migrations
|
|
344
|
+
* await orchestrator.retryFailed('0005_add_field')
|
|
345
|
+
*
|
|
346
|
+
* // Rollback if needed
|
|
347
|
+
* await orchestrator.rollbackAll('0005_add_field')
|
|
348
|
+
* ```
|
|
349
|
+
*/
|
|
350
|
+
export class BulkMigrationOrchestrator {
|
|
351
|
+
private registry: MigrationRegistry
|
|
352
|
+
private queue: Queue<MigrationQueueMessage> | undefined
|
|
353
|
+
private config: Required<Omit<BulkOrchestratorConfig, 'registry' | 'queue' | 'storage'>>
|
|
354
|
+
private storage: BulkMigrationStorage
|
|
355
|
+
/** @internal Reserved for future concurrent batch tracking */
|
|
356
|
+
private _activeBatches: Map<string, Promise<void>> = new Map()
|
|
357
|
+
|
|
358
|
+
constructor(config: BulkOrchestratorConfig) {
|
|
359
|
+
void this._activeBatches // Reserved for future concurrent batch tracking
|
|
360
|
+
this.registry = config.registry
|
|
361
|
+
this.queue = config.queue
|
|
362
|
+
this.config = {
|
|
363
|
+
concurrency: config.concurrency ?? 10,
|
|
364
|
+
maxRetries: config.maxRetries ?? 3,
|
|
365
|
+
retryDelayMs: config.retryDelayMs ?? 1000,
|
|
366
|
+
batchSize: config.batchSize ?? 100,
|
|
367
|
+
debug: config.debug ?? false,
|
|
368
|
+
}
|
|
369
|
+
this.storage = config.storage ?? new InMemoryBulkMigrationStorage()
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Log debug message
|
|
374
|
+
*/
|
|
375
|
+
private log(message: string, ...args: unknown[]): void {
|
|
376
|
+
if (this.config.debug) {
|
|
377
|
+
bulkOrchestratorLogger.debug(message, args.length > 0 ? { args } : undefined)
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Get DO IDs matching the selector
|
|
383
|
+
*
|
|
384
|
+
* Note: In production, this would typically query a DO namespace listing
|
|
385
|
+
* or a registry of active DOs. This is a simplified implementation.
|
|
386
|
+
*/
|
|
387
|
+
private async getDOIds(
|
|
388
|
+
selector: DOSelector,
|
|
389
|
+
getDOIdsFn?: (selector: DOSelector) => Promise<string[]>
|
|
390
|
+
): Promise<string[]> {
|
|
391
|
+
// If a custom function is provided, use it
|
|
392
|
+
if (getDOIdsFn) {
|
|
393
|
+
return getDOIdsFn(selector)
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Otherwise, require explicit IDs
|
|
397
|
+
if (!selector.ids || selector.ids.length === 0) {
|
|
398
|
+
throw new Error(
|
|
399
|
+
'selector.ids must be provided, or pass getDOIdsFn to scheduleMigration()'
|
|
400
|
+
)
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
let ids = selector.ids
|
|
404
|
+
|
|
405
|
+
// Apply prefix filter
|
|
406
|
+
if (selector.idPrefix) {
|
|
407
|
+
ids = ids.filter((id) => id.startsWith(selector.idPrefix!))
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// Apply custom filter
|
|
411
|
+
if (selector.filter) {
|
|
412
|
+
ids = ids.filter(selector.filter)
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Apply limit
|
|
416
|
+
if (selector.limit) {
|
|
417
|
+
ids = ids.slice(0, selector.limit)
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return ids
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Schedule a migration for all DOs matching the selector
|
|
425
|
+
*
|
|
426
|
+
* @param migrationId Migration ID to run
|
|
427
|
+
* @param selector DO selector
|
|
428
|
+
* @param getDOIdsFn Optional function to get DO IDs (for production use)
|
|
429
|
+
* @returns Batch information
|
|
430
|
+
*
|
|
431
|
+
* @example
|
|
432
|
+
* ```typescript
|
|
433
|
+
* // With explicit IDs
|
|
434
|
+
* await orchestrator.scheduleMigration('0005_add_field', {
|
|
435
|
+
* ids: ['user_1', 'user_2', 'user_3'],
|
|
436
|
+
* })
|
|
437
|
+
*
|
|
438
|
+
* // With custom DO listing function
|
|
439
|
+
* await orchestrator.scheduleMigration('0005_add_field', {
|
|
440
|
+
* idPrefix: 'user_',
|
|
441
|
+
* }, async (selector) => {
|
|
442
|
+
* // Query your DO namespace or registry
|
|
443
|
+
* return await listActiveDOs(selector)
|
|
444
|
+
* })
|
|
445
|
+
* ```
|
|
446
|
+
*/
|
|
447
|
+
async scheduleMigration(
|
|
448
|
+
migrationId: string,
|
|
449
|
+
selector: DOSelector,
|
|
450
|
+
getDOIdsFn?: (selector: DOSelector) => Promise<string[]>
|
|
451
|
+
): Promise<MigrationBatch> {
|
|
452
|
+
this.log(`Scheduling migration ${migrationId}`)
|
|
453
|
+
|
|
454
|
+
// Validate migration exists
|
|
455
|
+
const migration = this.registry.getMigration(migrationId)
|
|
456
|
+
if (!migration) {
|
|
457
|
+
throw new Error(`Migration ${migrationId} not found in registry`)
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// Get DO IDs to migrate
|
|
461
|
+
const doIds = await this.getDOIds(selector, getDOIdsFn)
|
|
462
|
+
this.log(`Found ${doIds.length} DOs to migrate`)
|
|
463
|
+
|
|
464
|
+
// Create batch
|
|
465
|
+
const batchId = generateId('batch')
|
|
466
|
+
const batch: MigrationBatch = {
|
|
467
|
+
batchId,
|
|
468
|
+
migrationId,
|
|
469
|
+
jobs: [],
|
|
470
|
+
totalJobs: doIds.length,
|
|
471
|
+
completedJobs: 0,
|
|
472
|
+
failedJobs: 0,
|
|
473
|
+
startedAt: new Date(),
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Create jobs for each DO
|
|
477
|
+
const jobs: DOBulkMigrationJob[] = []
|
|
478
|
+
for (const doId of doIds) {
|
|
479
|
+
const jobId = generateId('job')
|
|
480
|
+
const job: DOBulkMigrationJob = {
|
|
481
|
+
jobId,
|
|
482
|
+
migrationId,
|
|
483
|
+
doId,
|
|
484
|
+
status: 'pending',
|
|
485
|
+
retryCount: 0,
|
|
486
|
+
maxRetries: this.config.maxRetries,
|
|
487
|
+
createdAt: new Date(),
|
|
488
|
+
updatedAt: new Date(),
|
|
489
|
+
}
|
|
490
|
+
jobs.push(job)
|
|
491
|
+
await this.storage.saveJob(job)
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
batch.jobs = jobs
|
|
495
|
+
await this.storage.saveBatch(batch)
|
|
496
|
+
|
|
497
|
+
// Queue the jobs
|
|
498
|
+
if (this.queue) {
|
|
499
|
+
await this.queueJobs(batch, jobs)
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
this.log(`Batch ${batchId} created with ${jobs.length} jobs`)
|
|
503
|
+
|
|
504
|
+
return batch
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* Queue jobs for processing
|
|
509
|
+
*/
|
|
510
|
+
private async queueJobs(batch: MigrationBatch, jobs: DOBulkMigrationJob[]): Promise<void> {
|
|
511
|
+
if (!this.queue) {
|
|
512
|
+
throw new Error('Queue not configured')
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// Send jobs to queue in batches
|
|
516
|
+
for (let i = 0; i < jobs.length; i += this.config.batchSize) {
|
|
517
|
+
const batchJobs = jobs.slice(i, i + this.config.batchSize)
|
|
518
|
+
const messages: MessageSendRequest<MigrationQueueMessage>[] = batchJobs.map((job) => ({
|
|
519
|
+
body: {
|
|
520
|
+
type: 'migrate',
|
|
521
|
+
migrationId: job.migrationId,
|
|
522
|
+
doId: job.doId,
|
|
523
|
+
jobId: job.jobId,
|
|
524
|
+
retryAttempt: 0,
|
|
525
|
+
batchId: batch.batchId,
|
|
526
|
+
},
|
|
527
|
+
}))
|
|
528
|
+
|
|
529
|
+
await this.queue.sendBatch(messages)
|
|
530
|
+
|
|
531
|
+
// Update job status to queued
|
|
532
|
+
for (const job of batchJobs) {
|
|
533
|
+
job.status = 'queued'
|
|
534
|
+
job.updatedAt = new Date()
|
|
535
|
+
await this.storage.saveJob(job)
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Process a batch of migration jobs with concurrency control
|
|
542
|
+
*
|
|
543
|
+
* @param batch Jobs to process
|
|
544
|
+
* @param getExecutor Function to get QueryExecutor for a DO ID
|
|
545
|
+
* @returns Processing results
|
|
546
|
+
*
|
|
547
|
+
* @example
|
|
548
|
+
* ```typescript
|
|
549
|
+
* const batch = await orchestrator.getBatch(batchId)
|
|
550
|
+
* await orchestrator.processBatch(batch, async (doId) => {
|
|
551
|
+
* const stub = env.MY_DO.get(env.MY_DO.idFromName(doId))
|
|
552
|
+
* return stub.getExecutor()
|
|
553
|
+
* })
|
|
554
|
+
* ```
|
|
555
|
+
*/
|
|
556
|
+
async processBatch(
|
|
557
|
+
batch: MigrationBatch,
|
|
558
|
+
getExecutor: (doId: string) => Promise<QueryExecutor>
|
|
559
|
+
): Promise<{
|
|
560
|
+
completed: number
|
|
561
|
+
failed: number
|
|
562
|
+
results: Array<{ jobId: string; success: boolean; error?: string }>
|
|
563
|
+
}> {
|
|
564
|
+
this.log(`Processing batch ${batch.batchId} with ${batch.jobs.length} jobs`)
|
|
565
|
+
|
|
566
|
+
const results: Array<{ jobId: string; success: boolean; error?: string }> = []
|
|
567
|
+
let completed = 0
|
|
568
|
+
let failed = 0
|
|
569
|
+
|
|
570
|
+
// Process jobs with concurrency control
|
|
571
|
+
const activeJobs: Promise<void>[] = []
|
|
572
|
+
|
|
573
|
+
for (const job of batch.jobs) {
|
|
574
|
+
// Skip already completed jobs
|
|
575
|
+
if (job.status === 'completed' || job.status === 'rolled_back') {
|
|
576
|
+
continue
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// Wait if we've hit concurrency limit
|
|
580
|
+
if (activeJobs.length >= this.config.concurrency) {
|
|
581
|
+
await Promise.race(activeJobs)
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// Process job
|
|
585
|
+
const jobPromise = this.processJob(job, getExecutor)
|
|
586
|
+
.then((result) => {
|
|
587
|
+
if (result.success) {
|
|
588
|
+
completed++
|
|
589
|
+
} else {
|
|
590
|
+
failed++
|
|
591
|
+
}
|
|
592
|
+
results.push(result)
|
|
593
|
+
|
|
594
|
+
// Remove from active jobs
|
|
595
|
+
const index = activeJobs.indexOf(jobPromise)
|
|
596
|
+
if (index >= 0) {
|
|
597
|
+
activeJobs.splice(index, 1)
|
|
598
|
+
}
|
|
599
|
+
})
|
|
600
|
+
.catch((error) => {
|
|
601
|
+
this.log(`Job ${job.jobId} error:`, error)
|
|
602
|
+
failed++
|
|
603
|
+
results.push({
|
|
604
|
+
jobId: job.jobId,
|
|
605
|
+
success: false,
|
|
606
|
+
error: error instanceof Error ? error.message : String(error),
|
|
607
|
+
})
|
|
608
|
+
|
|
609
|
+
// Remove from active jobs
|
|
610
|
+
const index = activeJobs.indexOf(jobPromise)
|
|
611
|
+
if (index >= 0) {
|
|
612
|
+
activeJobs.splice(index, 1)
|
|
613
|
+
}
|
|
614
|
+
})
|
|
615
|
+
|
|
616
|
+
activeJobs.push(jobPromise)
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// Wait for all remaining jobs
|
|
620
|
+
await Promise.all(activeJobs)
|
|
621
|
+
|
|
622
|
+
// Update batch
|
|
623
|
+
batch.completedJobs = completed
|
|
624
|
+
batch.failedJobs = failed
|
|
625
|
+
if (completed + failed >= batch.totalJobs) {
|
|
626
|
+
batch.completedAt = new Date()
|
|
627
|
+
}
|
|
628
|
+
await this.storage.saveBatch(batch)
|
|
629
|
+
|
|
630
|
+
this.log(`Batch ${batch.batchId} processing complete: ${completed} succeeded, ${failed} failed`)
|
|
631
|
+
|
|
632
|
+
return { completed, failed, results }
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
* Process a single migration job
|
|
637
|
+
*/
|
|
638
|
+
private async processJob(
|
|
639
|
+
job: DOBulkMigrationJob,
|
|
640
|
+
getExecutor: (doId: string) => Promise<QueryExecutor>
|
|
641
|
+
): Promise<{ jobId: string; success: boolean; error?: string }> {
|
|
642
|
+
this.log(`Processing job ${job.jobId} for DO ${job.doId}`)
|
|
643
|
+
|
|
644
|
+
const startTime = performance.now()
|
|
645
|
+
|
|
646
|
+
try {
|
|
647
|
+
// Update job status
|
|
648
|
+
job.status = 'running'
|
|
649
|
+
job.updatedAt = new Date()
|
|
650
|
+
await this.storage.saveJob(job)
|
|
651
|
+
|
|
652
|
+
// Get executor for this DO
|
|
653
|
+
const executor = await getExecutor(job.doId)
|
|
654
|
+
|
|
655
|
+
// Get migration
|
|
656
|
+
const migration = this.registry.getMigration(job.migrationId)
|
|
657
|
+
if (!migration) {
|
|
658
|
+
throw new Error(`Migration ${job.migrationId} not found`)
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// Execute migration
|
|
662
|
+
await this.executeMigration(executor, migration)
|
|
663
|
+
|
|
664
|
+
// Update job as completed
|
|
665
|
+
const executionTimeMs = Math.round(performance.now() - startTime)
|
|
666
|
+
job.status = 'completed'
|
|
667
|
+
job.completedAt = new Date()
|
|
668
|
+
job.updatedAt = new Date()
|
|
669
|
+
job.executionTimeMs = executionTimeMs
|
|
670
|
+
await this.storage.saveJob(job)
|
|
671
|
+
|
|
672
|
+
this.log(`Job ${job.jobId} completed in ${executionTimeMs}ms`)
|
|
673
|
+
|
|
674
|
+
return { jobId: job.jobId, success: true }
|
|
675
|
+
} catch (error) {
|
|
676
|
+
const executionTimeMs = Math.round(performance.now() - startTime)
|
|
677
|
+
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
678
|
+
|
|
679
|
+
this.log(`Job ${job.jobId} failed:`, errorMessage)
|
|
680
|
+
|
|
681
|
+
// Check if we should retry
|
|
682
|
+
if (job.retryCount < job.maxRetries) {
|
|
683
|
+
job.status = 'retrying'
|
|
684
|
+
job.retryCount++
|
|
685
|
+
job.error = errorMessage
|
|
686
|
+
job.updatedAt = new Date()
|
|
687
|
+
job.executionTimeMs = executionTimeMs
|
|
688
|
+
await this.storage.saveJob(job)
|
|
689
|
+
|
|
690
|
+
// Schedule retry (with exponential backoff)
|
|
691
|
+
const retryDelay = this.config.retryDelayMs * Math.pow(2, job.retryCount - 1)
|
|
692
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelay))
|
|
693
|
+
|
|
694
|
+
// Retry
|
|
695
|
+
return this.processJob(job, getExecutor)
|
|
696
|
+
} else {
|
|
697
|
+
// Max retries exceeded
|
|
698
|
+
job.status = 'failed'
|
|
699
|
+
job.error = errorMessage
|
|
700
|
+
job.completedAt = new Date()
|
|
701
|
+
job.updatedAt = new Date()
|
|
702
|
+
job.executionTimeMs = executionTimeMs
|
|
703
|
+
await this.storage.saveJob(job)
|
|
704
|
+
|
|
705
|
+
return { jobId: job.jobId, success: false, error: errorMessage }
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
/**
|
|
711
|
+
* Execute a migration on a single DO
|
|
712
|
+
*/
|
|
713
|
+
private async executeMigration(
|
|
714
|
+
executor: QueryExecutor,
|
|
715
|
+
migration: Migration
|
|
716
|
+
): Promise<void> {
|
|
717
|
+
// Check if migration is already applied
|
|
718
|
+
const checkResult = await executor.query<{ count: number }>(
|
|
719
|
+
`SELECT COUNT(*) as count FROM _migrations WHERE id = $1 AND status = 'applied'`,
|
|
720
|
+
[migration.id]
|
|
721
|
+
)
|
|
722
|
+
|
|
723
|
+
if (checkResult.rows[0]?.count && checkResult.rows[0].count > 0) {
|
|
724
|
+
this.log(`Migration ${migration.id} already applied, skipping`)
|
|
725
|
+
return
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
// Execute migration in a transaction
|
|
729
|
+
await executor.query('BEGIN')
|
|
730
|
+
|
|
731
|
+
try {
|
|
732
|
+
// Run migration SQL
|
|
733
|
+
await executor.query(migration.up)
|
|
734
|
+
|
|
735
|
+
// Record migration
|
|
736
|
+
const checksum = await this.calculateChecksum(migration.up)
|
|
737
|
+
await executor.query(
|
|
738
|
+
`INSERT INTO _migrations (id, name, version, checksum, execution_time_ms, status)
|
|
739
|
+
VALUES ($1, $2, $3, $4, 0, 'applied')
|
|
740
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
741
|
+
status = 'applied',
|
|
742
|
+
applied_at = CURRENT_TIMESTAMP`,
|
|
743
|
+
[migration.id, migration.name, migration.version, checksum]
|
|
744
|
+
)
|
|
745
|
+
|
|
746
|
+
await executor.query('COMMIT')
|
|
747
|
+
} catch (error) {
|
|
748
|
+
await executor.query('ROLLBACK')
|
|
749
|
+
throw error
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/**
|
|
754
|
+
* Calculate checksum for migration content
|
|
755
|
+
*/
|
|
756
|
+
private async calculateChecksum(content: string): Promise<string> {
|
|
757
|
+
const encoder = new TextEncoder()
|
|
758
|
+
const data = encoder.encode(content)
|
|
759
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data)
|
|
760
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer))
|
|
761
|
+
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
/**
|
|
765
|
+
* Get migration progress
|
|
766
|
+
*
|
|
767
|
+
* @param migrationId Migration ID to check
|
|
768
|
+
* @returns Progress information
|
|
769
|
+
*/
|
|
770
|
+
async getProgress(migrationId: string): Promise<BulkMigrationProgress> {
|
|
771
|
+
const jobs = await this.storage.getJobsForMigration(migrationId)
|
|
772
|
+
|
|
773
|
+
const total = jobs.length
|
|
774
|
+
const completed = jobs.filter((j) => j.status === 'completed').length
|
|
775
|
+
const failed = jobs.filter((j) => j.status === 'failed').length
|
|
776
|
+
const running = jobs.filter((j) => j.status === 'running').length
|
|
777
|
+
const queued = jobs.filter((j) => j.status === 'queued' || j.status === 'pending').length
|
|
778
|
+
|
|
779
|
+
const progressPercent = total > 0 ? Math.round((completed / total) * 100) : 0
|
|
780
|
+
|
|
781
|
+
return {
|
|
782
|
+
migrationId,
|
|
783
|
+
total,
|
|
784
|
+
completed,
|
|
785
|
+
failed,
|
|
786
|
+
running,
|
|
787
|
+
queued,
|
|
788
|
+
progressPercent,
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
/**
|
|
793
|
+
* Retry all failed migrations for a migration ID
|
|
794
|
+
*
|
|
795
|
+
* @param migrationId Migration ID
|
|
796
|
+
* @param getExecutor Function to get QueryExecutor for a DO ID
|
|
797
|
+
* @returns Number of jobs retried
|
|
798
|
+
*/
|
|
799
|
+
async retryFailed(
|
|
800
|
+
migrationId: string,
|
|
801
|
+
getExecutor: (doId: string) => Promise<QueryExecutor>
|
|
802
|
+
): Promise<number> {
|
|
803
|
+
this.log(`Retrying failed migrations for ${migrationId}`)
|
|
804
|
+
|
|
805
|
+
const jobs = await this.storage.getJobsForMigration(migrationId)
|
|
806
|
+
const failedJobs = jobs.filter((j) => j.status === 'failed')
|
|
807
|
+
|
|
808
|
+
this.log(`Found ${failedJobs.length} failed jobs to retry`)
|
|
809
|
+
|
|
810
|
+
// Reset retry count and status
|
|
811
|
+
for (const job of failedJobs) {
|
|
812
|
+
job.retryCount = 0
|
|
813
|
+
job.status = 'pending'
|
|
814
|
+
delete job.error
|
|
815
|
+
job.updatedAt = new Date()
|
|
816
|
+
await this.storage.saveJob(job)
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// Create a temporary batch for processing
|
|
820
|
+
const batchId = generateId('retry_batch')
|
|
821
|
+
const batch: MigrationBatch = {
|
|
822
|
+
batchId,
|
|
823
|
+
migrationId,
|
|
824
|
+
jobs: failedJobs,
|
|
825
|
+
totalJobs: failedJobs.length,
|
|
826
|
+
completedJobs: 0,
|
|
827
|
+
failedJobs: 0,
|
|
828
|
+
startedAt: new Date(),
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
// Process the batch
|
|
832
|
+
await this.processBatch(batch, getExecutor)
|
|
833
|
+
|
|
834
|
+
return failedJobs.length
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
/**
|
|
838
|
+
* Rollback all DOs for a migration
|
|
839
|
+
*
|
|
840
|
+
* Coordinates rollback across all DOs that have this migration applied.
|
|
841
|
+
*
|
|
842
|
+
* @param migrationId Migration ID to rollback
|
|
843
|
+
* @param getExecutor Function to get QueryExecutor for a DO ID
|
|
844
|
+
* @returns Rollback results
|
|
845
|
+
*/
|
|
846
|
+
async rollbackAll(
|
|
847
|
+
migrationId: string,
|
|
848
|
+
getExecutor: (doId: string) => Promise<QueryExecutor>
|
|
849
|
+
): Promise<{
|
|
850
|
+
total: number
|
|
851
|
+
succeeded: number
|
|
852
|
+
failed: number
|
|
853
|
+
results: Array<{ doId: string; success: boolean; error?: string }>
|
|
854
|
+
}> {
|
|
855
|
+
this.log(`Rolling back migration ${migrationId}`)
|
|
856
|
+
|
|
857
|
+
// Get migration
|
|
858
|
+
const migration = this.registry.getMigration(migrationId)
|
|
859
|
+
if (!migration) {
|
|
860
|
+
throw new Error(`Migration ${migrationId} not found in registry`)
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
if (!migration.down) {
|
|
864
|
+
throw new Error(`Migration ${migrationId} has no rollback SQL defined`)
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
// Get all jobs for this migration that were completed
|
|
868
|
+
const jobs = await this.storage.getJobsForMigration(migrationId)
|
|
869
|
+
const completedJobs = jobs.filter((j) => j.status === 'completed')
|
|
870
|
+
|
|
871
|
+
this.log(`Found ${completedJobs.length} completed migrations to rollback`)
|
|
872
|
+
|
|
873
|
+
const results: Array<{ doId: string; success: boolean; error?: string }> = []
|
|
874
|
+
let succeeded = 0
|
|
875
|
+
let failed = 0
|
|
876
|
+
|
|
877
|
+
// Process rollbacks with concurrency control
|
|
878
|
+
const activeRollbacks: Promise<void>[] = []
|
|
879
|
+
|
|
880
|
+
for (const job of completedJobs) {
|
|
881
|
+
// Wait if we've hit concurrency limit
|
|
882
|
+
if (activeRollbacks.length >= this.config.concurrency) {
|
|
883
|
+
await Promise.race(activeRollbacks)
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
const rollbackPromise = this.rollbackJob(job, migration, getExecutor)
|
|
887
|
+
.then((result) => {
|
|
888
|
+
if (result.success) {
|
|
889
|
+
succeeded++
|
|
890
|
+
} else {
|
|
891
|
+
failed++
|
|
892
|
+
}
|
|
893
|
+
results.push(result)
|
|
894
|
+
|
|
895
|
+
// Remove from active rollbacks
|
|
896
|
+
const index = activeRollbacks.indexOf(rollbackPromise)
|
|
897
|
+
if (index >= 0) {
|
|
898
|
+
activeRollbacks.splice(index, 1)
|
|
899
|
+
}
|
|
900
|
+
})
|
|
901
|
+
.catch((error) => {
|
|
902
|
+
this.log(`Rollback for DO ${job.doId} error:`, error)
|
|
903
|
+
failed++
|
|
904
|
+
results.push({
|
|
905
|
+
doId: job.doId,
|
|
906
|
+
success: false,
|
|
907
|
+
error: error instanceof Error ? error.message : String(error),
|
|
908
|
+
})
|
|
909
|
+
|
|
910
|
+
// Remove from active rollbacks
|
|
911
|
+
const index = activeRollbacks.indexOf(rollbackPromise)
|
|
912
|
+
if (index >= 0) {
|
|
913
|
+
activeRollbacks.splice(index, 1)
|
|
914
|
+
}
|
|
915
|
+
})
|
|
916
|
+
|
|
917
|
+
activeRollbacks.push(rollbackPromise)
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
// Wait for all rollbacks
|
|
921
|
+
await Promise.all(activeRollbacks)
|
|
922
|
+
|
|
923
|
+
this.log(
|
|
924
|
+
`Rollback complete for ${migrationId}: ${succeeded} succeeded, ${failed} failed`
|
|
925
|
+
)
|
|
926
|
+
|
|
927
|
+
return {
|
|
928
|
+
total: completedJobs.length,
|
|
929
|
+
succeeded,
|
|
930
|
+
failed,
|
|
931
|
+
results,
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
/**
|
|
936
|
+
* Rollback a single migration job
|
|
937
|
+
*/
|
|
938
|
+
private async rollbackJob(
|
|
939
|
+
job: DOBulkMigrationJob,
|
|
940
|
+
migration: Migration,
|
|
941
|
+
getExecutor: (doId: string) => Promise<QueryExecutor>
|
|
942
|
+
): Promise<{ doId: string; success: boolean; error?: string }> {
|
|
943
|
+
this.log(`Rolling back job ${job.jobId} for DO ${job.doId}`)
|
|
944
|
+
|
|
945
|
+
try {
|
|
946
|
+
const executor = await getExecutor(job.doId)
|
|
947
|
+
|
|
948
|
+
// Execute rollback in a transaction
|
|
949
|
+
await executor.query('BEGIN')
|
|
950
|
+
|
|
951
|
+
try {
|
|
952
|
+
await executor.query(migration.down!)
|
|
953
|
+
await executor.query(
|
|
954
|
+
`UPDATE _migrations SET status = 'rolled_back', applied_at = CURRENT_TIMESTAMP WHERE id = $1`,
|
|
955
|
+
[migration.id]
|
|
956
|
+
)
|
|
957
|
+
await executor.query('COMMIT')
|
|
958
|
+
|
|
959
|
+
// Update job status
|
|
960
|
+
job.status = 'rolled_back'
|
|
961
|
+
job.updatedAt = new Date()
|
|
962
|
+
await this.storage.saveJob(job)
|
|
963
|
+
|
|
964
|
+
return { doId: job.doId, success: true }
|
|
965
|
+
} catch (error) {
|
|
966
|
+
await executor.query('ROLLBACK')
|
|
967
|
+
throw error
|
|
968
|
+
}
|
|
969
|
+
} catch (error) {
|
|
970
|
+
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
971
|
+
this.log(`Rollback failed for DO ${job.doId}:`, errorMessage)
|
|
972
|
+
return { doId: job.doId, success: false, error: errorMessage }
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* Get batch by ID
|
|
978
|
+
*/
|
|
979
|
+
async getBatch(batchId: string): Promise<MigrationBatch | null> {
|
|
980
|
+
return this.storage.getBatch(batchId)
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
/**
|
|
984
|
+
* Get job by ID
|
|
985
|
+
*/
|
|
986
|
+
async getJob(jobId: string): Promise<DOBulkMigrationJob | null> {
|
|
987
|
+
return this.storage.getJob(jobId)
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
/**
|
|
991
|
+
* Get all jobs for a migration
|
|
992
|
+
*/
|
|
993
|
+
async getJobs(migrationId: string): Promise<DOBulkMigrationJob[]> {
|
|
994
|
+
return this.storage.getJobsForMigration(migrationId)
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
/**
|
|
998
|
+
* Cancel a batch
|
|
999
|
+
*
|
|
1000
|
+
* Cancels all pending/queued jobs in a batch.
|
|
1001
|
+
*/
|
|
1002
|
+
async cancelBatch(batchId: string): Promise<number> {
|
|
1003
|
+
const batch = await this.storage.getBatch(batchId)
|
|
1004
|
+
if (!batch) {
|
|
1005
|
+
throw new Error(`Batch ${batchId} not found`)
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
let cancelled = 0
|
|
1009
|
+
for (const job of batch.jobs) {
|
|
1010
|
+
if (job.status === 'pending' || job.status === 'queued') {
|
|
1011
|
+
await this.storage.deleteJob(job.jobId)
|
|
1012
|
+
cancelled++
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
this.log(`Cancelled ${cancelled} jobs in batch ${batchId}`)
|
|
1017
|
+
|
|
1018
|
+
return cancelled
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
/**
|
|
1023
|
+
* Create a bulk migration orchestrator
|
|
1024
|
+
*
|
|
1025
|
+
* @example
|
|
1026
|
+
* ```typescript
|
|
1027
|
+
* const orchestrator = createBulkMigrationOrchestrator({
|
|
1028
|
+
* registry: migrationRegistry,
|
|
1029
|
+
* queue: env.MIGRATION_QUEUE,
|
|
1030
|
+
* concurrency: 20,
|
|
1031
|
+
* maxRetries: 3,
|
|
1032
|
+
* })
|
|
1033
|
+
* ```
|
|
1034
|
+
*/
|
|
1035
|
+
export function createBulkMigrationOrchestrator(
|
|
1036
|
+
config: BulkOrchestratorConfig
|
|
1037
|
+
): BulkMigrationOrchestrator {
|
|
1038
|
+
return new BulkMigrationOrchestrator(config)
|
|
1039
|
+
}
|