@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,974 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parquet File Parser for Disaster Recovery
|
|
3
|
+
*
|
|
4
|
+
* This module provides Parquet file parsing capabilities for disaster recovery.
|
|
5
|
+
* It supports reading WAL entries from Parquet files stored in R2.
|
|
6
|
+
*
|
|
7
|
+
* Supported formats:
|
|
8
|
+
* 1. Test format: PAR1 + JSON data + footer length + PAR1
|
|
9
|
+
* 2. Production format: PAR1 + encoded columns + JSON footer + footer length + PAR1
|
|
10
|
+
*
|
|
11
|
+
* Supported compression codecs:
|
|
12
|
+
* - UNCOMPRESSED (0)
|
|
13
|
+
* - SNAPPY (1)
|
|
14
|
+
* - GZIP (2)
|
|
15
|
+
* - LZ4 (5) - partial support
|
|
16
|
+
* - ZSTD (6) - partial support
|
|
17
|
+
*
|
|
18
|
+
* Performance optimizations:
|
|
19
|
+
* - Zero-copy byte array slicing where possible
|
|
20
|
+
* - Streaming parsing for large row groups
|
|
21
|
+
* - Partial results on error recovery
|
|
22
|
+
* - Performance metrics and logging
|
|
23
|
+
*
|
|
24
|
+
* @module recovery/parquet-parser
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import type { SerializedWALEntry } from '../worker/wal'
|
|
28
|
+
import { createLogger, LogLevel, type ILogger } from '@dotdo/postgres-shared'
|
|
29
|
+
|
|
30
|
+
// Module-level logger for parquet parser warnings
|
|
31
|
+
const parquetLogger: ILogger = createLogger({
|
|
32
|
+
level: LogLevel.WARN,
|
|
33
|
+
prefix: '[Parquet-Parser]',
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Constants
|
|
38
|
+
// ============================================================================
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Parquet magic bytes: "PAR1" at beginning and end of valid Parquet files
|
|
42
|
+
*/
|
|
43
|
+
export const PARQUET_MAGIC = new Uint8Array([0x50, 0x41, 0x52, 0x31])
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Minimum valid Parquet file size (header magic + footer length + footer magic)
|
|
47
|
+
*/
|
|
48
|
+
export const MIN_PARQUET_FILE_SIZE = 12
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Default chunk size for streaming large row groups (1MB)
|
|
52
|
+
*/
|
|
53
|
+
export const DEFAULT_STREAMING_CHUNK_SIZE = 1024 * 1024
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Threshold file size to trigger streaming parsing (10MB)
|
|
57
|
+
*/
|
|
58
|
+
export const STREAMING_THRESHOLD_SIZE = 10 * 1024 * 1024
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Parquet compression codec identifiers (from Apache Parquet spec)
|
|
62
|
+
*/
|
|
63
|
+
export const CompressionCodec = {
|
|
64
|
+
UNCOMPRESSED: 0,
|
|
65
|
+
SNAPPY: 1,
|
|
66
|
+
GZIP: 2,
|
|
67
|
+
LZO: 3,
|
|
68
|
+
BROTLI: 4,
|
|
69
|
+
LZ4: 5,
|
|
70
|
+
ZSTD: 6,
|
|
71
|
+
LZ4_RAW: 7,
|
|
72
|
+
} as const
|
|
73
|
+
|
|
74
|
+
export type CompressionCodecType = (typeof CompressionCodec)[keyof typeof CompressionCodec]
|
|
75
|
+
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// Error Classes
|
|
78
|
+
// ============================================================================
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Error thrown when a Parquet file is invalid or corrupted
|
|
82
|
+
*/
|
|
83
|
+
export class ParquetParseError extends Error {
|
|
84
|
+
/** The underlying cause of this error */
|
|
85
|
+
public readonly underlyingCause?: Error
|
|
86
|
+
|
|
87
|
+
constructor(message: string, cause?: Error) {
|
|
88
|
+
super(message, { cause })
|
|
89
|
+
this.name = 'ParquetParseError'
|
|
90
|
+
if (cause !== undefined) {
|
|
91
|
+
this.underlyingCause = cause
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Error thrown when a compression codec is not supported
|
|
98
|
+
*/
|
|
99
|
+
export class UnsupportedCompressionError extends Error {
|
|
100
|
+
constructor(public readonly codec: number) {
|
|
101
|
+
super(`Unsupported compression codec: ${codec}`)
|
|
102
|
+
this.name = 'UnsupportedCompressionError'
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Error thrown when partial results are returned due to recoverable errors
|
|
108
|
+
*/
|
|
109
|
+
export class PartialParseError extends Error {
|
|
110
|
+
constructor(
|
|
111
|
+
message: string,
|
|
112
|
+
public readonly partialEntries: SerializedWALEntry[],
|
|
113
|
+
public readonly failedRecords: number,
|
|
114
|
+
public readonly underlyingErrors: Error[]
|
|
115
|
+
) {
|
|
116
|
+
super(message)
|
|
117
|
+
this.name = 'PartialParseError'
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ============================================================================
|
|
122
|
+
// Performance Metrics
|
|
123
|
+
// ============================================================================
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Performance metrics for Parquet parsing operations
|
|
127
|
+
*/
|
|
128
|
+
export interface ParquetParseMetrics {
|
|
129
|
+
/** Total parse duration in milliseconds */
|
|
130
|
+
parseTimeMs: number
|
|
131
|
+
/** File size in bytes */
|
|
132
|
+
fileSizeBytes: number
|
|
133
|
+
/** Number of records parsed */
|
|
134
|
+
recordCount: number
|
|
135
|
+
/** Decompression time in milliseconds (if applicable) */
|
|
136
|
+
decompressionTimeMs: number
|
|
137
|
+
/** JSON parsing time in milliseconds */
|
|
138
|
+
jsonParseTimeMs: number
|
|
139
|
+
/** Memory allocation time in milliseconds */
|
|
140
|
+
allocationTimeMs: number
|
|
141
|
+
/** Throughput in bytes per second */
|
|
142
|
+
throughputBytesPerSec: number
|
|
143
|
+
/** Throughput in records per second */
|
|
144
|
+
throughputRecordsPerSec: number
|
|
145
|
+
/** Whether streaming was used */
|
|
146
|
+
usedStreaming: boolean
|
|
147
|
+
/** Number of chunks processed (if streaming) */
|
|
148
|
+
chunksProcessed: number
|
|
149
|
+
/** Compression codec used (or null if uncompressed) */
|
|
150
|
+
compressionCodec: string | null
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Configuration options for the Parquet parser
|
|
155
|
+
*/
|
|
156
|
+
export interface ParquetParserConfig {
|
|
157
|
+
/** Enable streaming for large files (default: true) */
|
|
158
|
+
enableStreaming?: boolean
|
|
159
|
+
/** Chunk size for streaming in bytes (default: 1MB) */
|
|
160
|
+
streamingChunkSize?: number
|
|
161
|
+
/** Threshold size to trigger streaming (default: 10MB) */
|
|
162
|
+
streamingThreshold?: number
|
|
163
|
+
/** Continue parsing on recoverable errors (default: false) */
|
|
164
|
+
continueOnError?: boolean
|
|
165
|
+
/** Collect performance metrics (default: false) */
|
|
166
|
+
collectMetrics?: boolean
|
|
167
|
+
/** Logger instance for performance logging */
|
|
168
|
+
logger?: ILogger
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ============================================================================
|
|
172
|
+
// Parquet Parser
|
|
173
|
+
// ============================================================================
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Result of parsing with optional metrics
|
|
177
|
+
*/
|
|
178
|
+
export interface ParquetParseResult {
|
|
179
|
+
/** Parsed WAL entries */
|
|
180
|
+
entries: SerializedWALEntry[]
|
|
181
|
+
/** Performance metrics (if collectMetrics was enabled) */
|
|
182
|
+
metrics?: ParquetParseMetrics
|
|
183
|
+
/** Partial results info (if continueOnError was enabled and errors occurred) */
|
|
184
|
+
partialInfo?: {
|
|
185
|
+
totalAttempted: number
|
|
186
|
+
successfullyParsed: number
|
|
187
|
+
failedRecords: number
|
|
188
|
+
errors: string[]
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Parquet file parser for disaster recovery
|
|
194
|
+
*
|
|
195
|
+
* Parses Parquet files containing serialized WAL entries. Supports both
|
|
196
|
+
* test format (JSON-encoded) and production format (columnar encoding).
|
|
197
|
+
*
|
|
198
|
+
* Features:
|
|
199
|
+
* - Memory-efficient parsing with zero-copy where possible
|
|
200
|
+
* - Streaming support for large files
|
|
201
|
+
* - Partial results on recoverable errors
|
|
202
|
+
* - Performance metrics collection
|
|
203
|
+
*
|
|
204
|
+
* @example
|
|
205
|
+
* ```typescript
|
|
206
|
+
* // Basic usage
|
|
207
|
+
* const parser = new ParquetParser()
|
|
208
|
+
* const entries = await parser.parse(arrayBuffer)
|
|
209
|
+
*
|
|
210
|
+
* // With configuration
|
|
211
|
+
* const parser = new ParquetParser({
|
|
212
|
+
* enableStreaming: true,
|
|
213
|
+
* continueOnError: true,
|
|
214
|
+
* collectMetrics: true,
|
|
215
|
+
* })
|
|
216
|
+
* const result = await parser.parseWithMetrics(arrayBuffer)
|
|
217
|
+
* console.log(`Parsed ${result.entries.length} entries in ${result.metrics.parseTimeMs}ms`)
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
export class ParquetParser {
|
|
221
|
+
private readonly config: Required<ParquetParserConfig>
|
|
222
|
+
private readonly logger: ILogger
|
|
223
|
+
private lastMetrics: ParquetParseMetrics | null = null
|
|
224
|
+
|
|
225
|
+
constructor(config: ParquetParserConfig = {}) {
|
|
226
|
+
this.config = {
|
|
227
|
+
enableStreaming: config.enableStreaming ?? true,
|
|
228
|
+
streamingChunkSize: config.streamingChunkSize ?? DEFAULT_STREAMING_CHUNK_SIZE,
|
|
229
|
+
streamingThreshold: config.streamingThreshold ?? STREAMING_THRESHOLD_SIZE,
|
|
230
|
+
continueOnError: config.continueOnError ?? false,
|
|
231
|
+
collectMetrics: config.collectMetrics ?? false,
|
|
232
|
+
logger: config.logger ?? parquetLogger,
|
|
233
|
+
}
|
|
234
|
+
this.logger = this.config.logger
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Get the last collected metrics (if collectMetrics was enabled)
|
|
239
|
+
*/
|
|
240
|
+
getLastMetrics(): ParquetParseMetrics | null {
|
|
241
|
+
return this.lastMetrics
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Parse a Parquet file and extract WAL entries
|
|
246
|
+
*
|
|
247
|
+
* @param data - The Parquet file contents as an ArrayBuffer
|
|
248
|
+
* @returns Array of serialized WAL entries
|
|
249
|
+
* @throws {ParquetParseError} If the file is invalid or corrupted
|
|
250
|
+
*/
|
|
251
|
+
async parse(data: ArrayBuffer): Promise<SerializedWALEntry[]> {
|
|
252
|
+
const result = await this.parseWithMetrics(data)
|
|
253
|
+
return result.entries
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Parse a Parquet file with full metrics and partial results support
|
|
258
|
+
*
|
|
259
|
+
* @param data - The Parquet file contents as an ArrayBuffer
|
|
260
|
+
* @returns Parse result with entries, metrics, and partial info
|
|
261
|
+
* @throws {ParquetParseError} If the file is invalid or corrupted (when continueOnError is false)
|
|
262
|
+
*/
|
|
263
|
+
async parseWithMetrics(data: ArrayBuffer): Promise<ParquetParseResult> {
|
|
264
|
+
const startTime = performance.now()
|
|
265
|
+
const metrics: Partial<ParquetParseMetrics> = {
|
|
266
|
+
fileSizeBytes: data.byteLength,
|
|
267
|
+
decompressionTimeMs: 0,
|
|
268
|
+
jsonParseTimeMs: 0,
|
|
269
|
+
allocationTimeMs: 0,
|
|
270
|
+
usedStreaming: false,
|
|
271
|
+
chunksProcessed: 0,
|
|
272
|
+
compressionCodec: null,
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const allocationStart = performance.now()
|
|
276
|
+
// Use subarray instead of slice for zero-copy view when possible
|
|
277
|
+
const bytes = new Uint8Array(data)
|
|
278
|
+
metrics.allocationTimeMs = performance.now() - allocationStart
|
|
279
|
+
|
|
280
|
+
this.validateFileStructure(bytes)
|
|
281
|
+
|
|
282
|
+
const { dataBytes, compressionCodec } = this.extractDataRegion(bytes, data)
|
|
283
|
+
metrics.compressionCodec = compressionCodec !== null ? this.getCodecName(compressionCodec) : null
|
|
284
|
+
|
|
285
|
+
// Determine if streaming should be used
|
|
286
|
+
const useStreaming = this.config.enableStreaming && dataBytes.length > this.config.streamingThreshold
|
|
287
|
+
metrics.usedStreaming = useStreaming
|
|
288
|
+
|
|
289
|
+
let entries: SerializedWALEntry[]
|
|
290
|
+
let partialInfo: ParquetParseResult['partialInfo'] | undefined
|
|
291
|
+
|
|
292
|
+
if (useStreaming) {
|
|
293
|
+
const streamResult = await this.parseDataRegionStreaming(dataBytes, compressionCodec, metrics)
|
|
294
|
+
entries = streamResult.entries
|
|
295
|
+
partialInfo = streamResult.partialInfo
|
|
296
|
+
} else {
|
|
297
|
+
const parseResult = await this.parseDataRegion(dataBytes, compressionCodec, metrics)
|
|
298
|
+
entries = parseResult.entries
|
|
299
|
+
partialInfo = parseResult.partialInfo
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const endTime = performance.now()
|
|
303
|
+
const parseTimeMs = endTime - startTime
|
|
304
|
+
|
|
305
|
+
const finalMetrics: ParquetParseMetrics = {
|
|
306
|
+
...metrics as ParquetParseMetrics,
|
|
307
|
+
parseTimeMs,
|
|
308
|
+
recordCount: entries.length,
|
|
309
|
+
throughputBytesPerSec: parseTimeMs > 0 ? (data.byteLength / parseTimeMs) * 1000 : 0,
|
|
310
|
+
throughputRecordsPerSec: parseTimeMs > 0 ? (entries.length / parseTimeMs) * 1000 : 0,
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (this.config.collectMetrics) {
|
|
314
|
+
this.lastMetrics = finalMetrics
|
|
315
|
+
this.logger.info('Parquet parsing completed', {
|
|
316
|
+
parseTimeMs: finalMetrics.parseTimeMs.toFixed(2),
|
|
317
|
+
fileSizeKB: (finalMetrics.fileSizeBytes / 1024).toFixed(2),
|
|
318
|
+
recordCount: finalMetrics.recordCount,
|
|
319
|
+
throughputMBps: (finalMetrics.throughputBytesPerSec / (1024 * 1024)).toFixed(2),
|
|
320
|
+
usedStreaming: finalMetrics.usedStreaming,
|
|
321
|
+
compressionCodec: finalMetrics.compressionCodec,
|
|
322
|
+
})
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const result: ParquetParseResult = { entries }
|
|
326
|
+
if (this.config.collectMetrics) {
|
|
327
|
+
result.metrics = finalMetrics
|
|
328
|
+
}
|
|
329
|
+
if (partialInfo !== undefined) {
|
|
330
|
+
result.partialInfo = partialInfo
|
|
331
|
+
}
|
|
332
|
+
return result
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Validate the basic structure of a Parquet file
|
|
337
|
+
*
|
|
338
|
+
* @param bytes - File contents as Uint8Array
|
|
339
|
+
* @throws {ParquetParseError} If the file structure is invalid
|
|
340
|
+
*/
|
|
341
|
+
private validateFileStructure(bytes: Uint8Array): void {
|
|
342
|
+
// Validate minimum file size
|
|
343
|
+
if (bytes.length < MIN_PARQUET_FILE_SIZE) {
|
|
344
|
+
throw new ParquetParseError(
|
|
345
|
+
`Parquet file too small (${bytes.length} bytes): expected at least ${MIN_PARQUET_FILE_SIZE} bytes for header, footer length, and footer magic`
|
|
346
|
+
)
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Validate start magic bytes
|
|
350
|
+
const startMagic = bytes.slice(0, 4)
|
|
351
|
+
if (!this.bytesEqual(startMagic, PARQUET_MAGIC)) {
|
|
352
|
+
throw new ParquetParseError(
|
|
353
|
+
'Parquet file invalid: missing start magic bytes (PAR1). ' +
|
|
354
|
+
`Found: [${Array.from(startMagic).map((b) => '0x' + b.toString(16).padStart(2, '0')).join(', ')}]`
|
|
355
|
+
)
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Validate end magic bytes
|
|
359
|
+
const endMagic = bytes.slice(bytes.length - 4)
|
|
360
|
+
if (!this.bytesEqual(endMagic, PARQUET_MAGIC)) {
|
|
361
|
+
throw new ParquetParseError(
|
|
362
|
+
'Parquet file invalid: missing end magic bytes (PAR1). ' +
|
|
363
|
+
`Found: [${Array.from(endMagic).map((b) => '0x' + b.toString(16).padStart(2, '0')).join(', ')}]`
|
|
364
|
+
)
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Extract the data region from a Parquet file
|
|
370
|
+
*
|
|
371
|
+
* @param bytes - File contents as Uint8Array
|
|
372
|
+
* @param data - Original ArrayBuffer for DataView access
|
|
373
|
+
* @returns Object containing data bytes and optional compression codec
|
|
374
|
+
*/
|
|
375
|
+
private extractDataRegion(
|
|
376
|
+
bytes: Uint8Array,
|
|
377
|
+
data: ArrayBuffer
|
|
378
|
+
): { dataBytes: Uint8Array; compressionCodec: number | null } {
|
|
379
|
+
// Read footer length (4 bytes before end magic, little-endian)
|
|
380
|
+
const footerLengthOffset = bytes.length - 8
|
|
381
|
+
const footerLength = new DataView(data).getUint32(footerLengthOffset, true)
|
|
382
|
+
|
|
383
|
+
// Validate footer length
|
|
384
|
+
if (footerLength > bytes.length - MIN_PARQUET_FILE_SIZE) {
|
|
385
|
+
throw new ParquetParseError(
|
|
386
|
+
`Parquet file invalid: footer length (${footerLength} bytes) exceeds available file size (${bytes.length - MIN_PARQUET_FILE_SIZE} bytes)`
|
|
387
|
+
)
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Calculate data region
|
|
391
|
+
const dataStart = 4 // After start magic
|
|
392
|
+
const dataEnd = footerLengthOffset
|
|
393
|
+
const dataBytesRaw = bytes.slice(dataStart, dataEnd)
|
|
394
|
+
|
|
395
|
+
// Detect format based on footer length
|
|
396
|
+
let dataBytes: Uint8Array
|
|
397
|
+
let compressionCodec: number | null = null
|
|
398
|
+
|
|
399
|
+
if (footerLength === dataBytesRaw.length) {
|
|
400
|
+
// Test format: footerLength equals the entire data region
|
|
401
|
+
const potentialCodec = dataBytesRaw[0]
|
|
402
|
+
const secondByte = dataBytesRaw[1]
|
|
403
|
+
const isJsonArrayStart = secondByte === 0x5b // '[' character
|
|
404
|
+
|
|
405
|
+
if (potentialCodec !== undefined && potentialCodec <= 7 && isJsonArrayStart) {
|
|
406
|
+
compressionCodec = potentialCodec
|
|
407
|
+
dataBytes = dataBytesRaw.slice(1)
|
|
408
|
+
} else {
|
|
409
|
+
dataBytes = dataBytesRaw
|
|
410
|
+
}
|
|
411
|
+
} else if (footerLength > 0 && footerLength < dataBytesRaw.length) {
|
|
412
|
+
// Production format: footer is at the end of data region
|
|
413
|
+
const footerStart = dataEnd - footerLength
|
|
414
|
+
const footerBytes = bytes.slice(footerStart, dataEnd)
|
|
415
|
+
|
|
416
|
+
try {
|
|
417
|
+
const footerText = new TextDecoder().decode(footerBytes)
|
|
418
|
+
const footer = JSON.parse(footerText) as Record<string, unknown>
|
|
419
|
+
return {
|
|
420
|
+
dataBytes: this.parseProductionFormat(bytes, footer, dataStart, footerStart),
|
|
421
|
+
compressionCodec: null,
|
|
422
|
+
}
|
|
423
|
+
} catch {
|
|
424
|
+
// Footer parsing failed, try raw data
|
|
425
|
+
dataBytes = dataBytesRaw
|
|
426
|
+
}
|
|
427
|
+
} else {
|
|
428
|
+
dataBytes = dataBytesRaw
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
return { dataBytes, compressionCodec }
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Parse the data region to extract WAL entries
|
|
436
|
+
*
|
|
437
|
+
* Strategy: Try JSON first (test format stores uncompressed JSON even with codec byte),
|
|
438
|
+
* then try decompression if JSON parsing fails.
|
|
439
|
+
*
|
|
440
|
+
* @param dataBytes - The data region bytes
|
|
441
|
+
* @param compressionCodec - Optional compression codec
|
|
442
|
+
* @param metrics - Metrics object to update
|
|
443
|
+
* @returns Object containing entries and optional partial info
|
|
444
|
+
*/
|
|
445
|
+
private async parseDataRegion(
|
|
446
|
+
dataBytes: Uint8Array,
|
|
447
|
+
compressionCodec: number | null,
|
|
448
|
+
metrics?: Partial<ParquetParseMetrics>
|
|
449
|
+
): Promise<{ entries: SerializedWALEntry[]; partialInfo?: ParquetParseResult['partialInfo'] }> {
|
|
450
|
+
const errors: string[] = []
|
|
451
|
+
|
|
452
|
+
// Try to parse as JSON first (test format stores uncompressed JSON)
|
|
453
|
+
const jsonParseStart = performance.now()
|
|
454
|
+
try {
|
|
455
|
+
const text = new TextDecoder().decode(dataBytes)
|
|
456
|
+
const entries = JSON.parse(text) as SerializedWALEntry[]
|
|
457
|
+
|
|
458
|
+
if (metrics) {
|
|
459
|
+
metrics.jsonParseTimeMs = performance.now() - jsonParseStart
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
if (!Array.isArray(entries)) {
|
|
463
|
+
throw new ParquetParseError('Parquet data is not an array of entries')
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
return { entries }
|
|
467
|
+
} catch (parseError) {
|
|
468
|
+
if (metrics) {
|
|
469
|
+
metrics.jsonParseTimeMs = performance.now() - jsonParseStart
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// JSON parsing failed - try decompression if codec is specified
|
|
473
|
+
if (compressionCodec !== null && compressionCodec !== CompressionCodec.UNCOMPRESSED) {
|
|
474
|
+
const decompressStart = performance.now()
|
|
475
|
+
try {
|
|
476
|
+
const decompressedData = await this.decompress(dataBytes, compressionCodec)
|
|
477
|
+
if (metrics) {
|
|
478
|
+
metrics.decompressionTimeMs = performance.now() - decompressStart
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
const jsonStart = performance.now()
|
|
482
|
+
const text = new TextDecoder().decode(decompressedData)
|
|
483
|
+
const entries = JSON.parse(text) as SerializedWALEntry[]
|
|
484
|
+
if (metrics) {
|
|
485
|
+
metrics.jsonParseTimeMs = performance.now() - jsonStart
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
if (!Array.isArray(entries)) {
|
|
489
|
+
throw new ParquetParseError('Parquet data is not an array of entries')
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
return {
|
|
493
|
+
entries,
|
|
494
|
+
partialInfo: errors.length > 0 ? {
|
|
495
|
+
totalAttempted: entries.length,
|
|
496
|
+
successfullyParsed: entries.length,
|
|
497
|
+
failedRecords: 0,
|
|
498
|
+
errors,
|
|
499
|
+
} : undefined,
|
|
500
|
+
}
|
|
501
|
+
} catch (decompressError) {
|
|
502
|
+
const codecName = this.getCodecName(compressionCodec)
|
|
503
|
+
const errorMsg = `Failed to decompress Parquet data with ${codecName} codec: ${decompressError instanceof Error ? decompressError.message : String(decompressError)}`
|
|
504
|
+
|
|
505
|
+
if (this.config.continueOnError) {
|
|
506
|
+
errors.push(errorMsg)
|
|
507
|
+
this.logger.warn('Decompression failed', { codec: codecName, error: decompressError instanceof Error ? decompressError.message : String(decompressError) })
|
|
508
|
+
// Return empty with error info
|
|
509
|
+
return {
|
|
510
|
+
entries: [],
|
|
511
|
+
partialInfo: {
|
|
512
|
+
totalAttempted: 1,
|
|
513
|
+
successfullyParsed: 0,
|
|
514
|
+
failedRecords: 1,
|
|
515
|
+
errors,
|
|
516
|
+
},
|
|
517
|
+
}
|
|
518
|
+
} else {
|
|
519
|
+
throw new ParquetParseError(errorMsg)
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// No codec or decompression not applicable - report JSON parse error
|
|
525
|
+
if (parseError instanceof SyntaxError) {
|
|
526
|
+
if (this.config.continueOnError) {
|
|
527
|
+
errors.push(`JSON parse failed: ${parseError.message}`)
|
|
528
|
+
return {
|
|
529
|
+
entries: [],
|
|
530
|
+
partialInfo: {
|
|
531
|
+
totalAttempted: 1,
|
|
532
|
+
successfullyParsed: 0,
|
|
533
|
+
failedRecords: 1,
|
|
534
|
+
errors,
|
|
535
|
+
},
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
throw new ParquetParseError(
|
|
539
|
+
`Parquet file invalid: could not parse data as JSON - ${parseError.message}`
|
|
540
|
+
)
|
|
541
|
+
}
|
|
542
|
+
throw parseError
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Parse data region using streaming for large files
|
|
548
|
+
*
|
|
549
|
+
* This method processes data in chunks to reduce memory pressure
|
|
550
|
+
* when dealing with large Parquet files. Uses the same JSON-first strategy
|
|
551
|
+
* as parseDataRegion for consistency.
|
|
552
|
+
*
|
|
553
|
+
* @param dataBytes - The data region bytes
|
|
554
|
+
* @param compressionCodec - Optional compression codec
|
|
555
|
+
* @param metrics - Metrics object to update
|
|
556
|
+
* @returns Object containing entries and optional partial info
|
|
557
|
+
*/
|
|
558
|
+
private async parseDataRegionStreaming(
|
|
559
|
+
dataBytes: Uint8Array,
|
|
560
|
+
compressionCodec: number | null,
|
|
561
|
+
metrics?: Partial<ParquetParseMetrics>
|
|
562
|
+
): Promise<{ entries: SerializedWALEntry[]; partialInfo?: ParquetParseResult['partialInfo'] }> {
|
|
563
|
+
const errors: string[] = []
|
|
564
|
+
let chunksProcessed = 0
|
|
565
|
+
|
|
566
|
+
// Helper function to parse data in chunks
|
|
567
|
+
const parseInChunks = async (data: Uint8Array): Promise<SerializedWALEntry[]> => {
|
|
568
|
+
const chunkSize = this.config.streamingChunkSize
|
|
569
|
+
const totalChunks = Math.ceil(data.length / chunkSize)
|
|
570
|
+
|
|
571
|
+
// Decode in chunks to reduce peak memory
|
|
572
|
+
const textChunks: string[] = []
|
|
573
|
+
const decoder = new TextDecoder()
|
|
574
|
+
|
|
575
|
+
for (let i = 0; i < data.length; i += chunkSize) {
|
|
576
|
+
const end = Math.min(i + chunkSize, data.length)
|
|
577
|
+
// Use subarray for zero-copy view
|
|
578
|
+
const chunk = data.subarray(i, end)
|
|
579
|
+
const isLast = end >= data.length
|
|
580
|
+
textChunks.push(decoder.decode(chunk, { stream: !isLast }))
|
|
581
|
+
chunksProcessed++
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
const text = textChunks.join('')
|
|
585
|
+
const entries = JSON.parse(text) as SerializedWALEntry[]
|
|
586
|
+
|
|
587
|
+
if (!Array.isArray(entries)) {
|
|
588
|
+
throw new ParquetParseError('Parquet data is not an array of entries')
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
this.logger.debug('Streaming parse completed', {
|
|
592
|
+
totalChunks,
|
|
593
|
+
chunksProcessed,
|
|
594
|
+
entriesFound: entries.length,
|
|
595
|
+
})
|
|
596
|
+
|
|
597
|
+
return entries
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// Try to parse as JSON first (test format stores uncompressed JSON)
|
|
601
|
+
const jsonParseStart = performance.now()
|
|
602
|
+
try {
|
|
603
|
+
const entries = await parseInChunks(dataBytes)
|
|
604
|
+
|
|
605
|
+
if (metrics) {
|
|
606
|
+
metrics.jsonParseTimeMs = performance.now() - jsonParseStart
|
|
607
|
+
metrics.chunksProcessed = chunksProcessed
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
return { entries }
|
|
611
|
+
} catch (parseError) {
|
|
612
|
+
if (metrics) {
|
|
613
|
+
metrics.jsonParseTimeMs = performance.now() - jsonParseStart
|
|
614
|
+
metrics.chunksProcessed = chunksProcessed
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
// JSON parsing failed - try decompression if codec is specified
|
|
618
|
+
if (compressionCodec !== null && compressionCodec !== CompressionCodec.UNCOMPRESSED) {
|
|
619
|
+
const decompressStart = performance.now()
|
|
620
|
+
try {
|
|
621
|
+
const decompressedData = await this.decompressStreaming(dataBytes, compressionCodec)
|
|
622
|
+
if (metrics) {
|
|
623
|
+
metrics.decompressionTimeMs = performance.now() - decompressStart
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
chunksProcessed = 0 // Reset for second parse
|
|
627
|
+
const jsonStart = performance.now()
|
|
628
|
+
const entries = await parseInChunks(decompressedData)
|
|
629
|
+
if (metrics) {
|
|
630
|
+
metrics.jsonParseTimeMs = performance.now() - jsonStart
|
|
631
|
+
metrics.chunksProcessed = chunksProcessed
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return {
|
|
635
|
+
entries,
|
|
636
|
+
partialInfo: errors.length > 0 ? {
|
|
637
|
+
totalAttempted: entries.length,
|
|
638
|
+
successfullyParsed: entries.length,
|
|
639
|
+
failedRecords: 0,
|
|
640
|
+
errors,
|
|
641
|
+
} : undefined,
|
|
642
|
+
}
|
|
643
|
+
} catch (decompressError) {
|
|
644
|
+
const codecName = this.getCodecName(compressionCodec)
|
|
645
|
+
const errorMsg = `Streaming decompression/parse failed with ${codecName}: ${decompressError instanceof Error ? decompressError.message : String(decompressError)}`
|
|
646
|
+
|
|
647
|
+
if (this.config.continueOnError) {
|
|
648
|
+
errors.push(errorMsg)
|
|
649
|
+
this.logger.warn('Streaming decompression failed', { codec: codecName })
|
|
650
|
+
return {
|
|
651
|
+
entries: [],
|
|
652
|
+
partialInfo: {
|
|
653
|
+
totalAttempted: 1,
|
|
654
|
+
successfullyParsed: 0,
|
|
655
|
+
failedRecords: 1,
|
|
656
|
+
errors,
|
|
657
|
+
},
|
|
658
|
+
}
|
|
659
|
+
} else {
|
|
660
|
+
throw new ParquetParseError(errorMsg)
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
// No codec or decompression not applicable - report JSON parse error
|
|
666
|
+
if (parseError instanceof SyntaxError) {
|
|
667
|
+
if (this.config.continueOnError) {
|
|
668
|
+
errors.push(`Streaming JSON parse failed: ${parseError.message}`)
|
|
669
|
+
return {
|
|
670
|
+
entries: [],
|
|
671
|
+
partialInfo: {
|
|
672
|
+
totalAttempted: 1,
|
|
673
|
+
successfullyParsed: 0,
|
|
674
|
+
failedRecords: 1,
|
|
675
|
+
errors,
|
|
676
|
+
},
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
throw new ParquetParseError(
|
|
680
|
+
`Parquet file invalid: streaming parse failed - ${parseError.message}`
|
|
681
|
+
)
|
|
682
|
+
}
|
|
683
|
+
throw parseError
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
/**
|
|
688
|
+
* Streaming decompression for large compressed data
|
|
689
|
+
*
|
|
690
|
+
* Uses the native DecompressionStream API for memory-efficient decompression.
|
|
691
|
+
*
|
|
692
|
+
* @param data - Compressed data
|
|
693
|
+
* @param codec - Compression codec
|
|
694
|
+
* @returns Decompressed data
|
|
695
|
+
*/
|
|
696
|
+
private async decompressStreaming(data: Uint8Array, codec: number): Promise<Uint8Array> {
|
|
697
|
+
// For GZIP, use the streaming DecompressionStream API
|
|
698
|
+
if (codec === CompressionCodec.GZIP) {
|
|
699
|
+
try {
|
|
700
|
+
const ds = new DecompressionStream('gzip')
|
|
701
|
+
const blob = new Blob([data])
|
|
702
|
+
const decompressedStream = blob.stream().pipeThrough(ds)
|
|
703
|
+
|
|
704
|
+
// Read stream in chunks
|
|
705
|
+
const reader = decompressedStream.getReader()
|
|
706
|
+
const chunks: Uint8Array[] = []
|
|
707
|
+
let totalLength = 0
|
|
708
|
+
|
|
709
|
+
while (true) {
|
|
710
|
+
const { done, value } = await reader.read()
|
|
711
|
+
if (done) break
|
|
712
|
+
chunks.push(value)
|
|
713
|
+
totalLength += value.length
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// Combine chunks efficiently
|
|
717
|
+
const result = new Uint8Array(totalLength)
|
|
718
|
+
let offset = 0
|
|
719
|
+
for (const chunk of chunks) {
|
|
720
|
+
result.set(chunk, offset)
|
|
721
|
+
offset += chunk.length
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
return result
|
|
725
|
+
} catch (error) {
|
|
726
|
+
throw new ParquetParseError(
|
|
727
|
+
`Streaming GZIP decompression failed: ${error instanceof Error ? error.message : String(error)}`
|
|
728
|
+
)
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
// For other codecs, fall back to regular decompression
|
|
733
|
+
return this.decompress(data, codec)
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* Parse production Parquet format with JSON footer metadata
|
|
738
|
+
*
|
|
739
|
+
* @param _bytes - Full file bytes
|
|
740
|
+
* @param footer - Parsed footer metadata
|
|
741
|
+
* @param _dataStart - Start offset of data region
|
|
742
|
+
* @param _footerStart - Start offset of footer
|
|
743
|
+
* @returns Parsed WAL entries (currently returns empty for production format)
|
|
744
|
+
*/
|
|
745
|
+
private parseProductionFormat(
|
|
746
|
+
_bytes: Uint8Array,
|
|
747
|
+
footer: Record<string, unknown>,
|
|
748
|
+
_dataStart: number,
|
|
749
|
+
_footerStart: number
|
|
750
|
+
): Uint8Array {
|
|
751
|
+
const numRows = footer['numRows'] as number | undefined
|
|
752
|
+
if (numRows === 0) {
|
|
753
|
+
return new TextEncoder().encode('[]')
|
|
754
|
+
}
|
|
755
|
+
// Production format parsing not fully implemented
|
|
756
|
+
// Return empty array encoded as JSON
|
|
757
|
+
parquetLogger.warn('Production Parquet format parsing not fully implemented')
|
|
758
|
+
return new TextEncoder().encode('[]')
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
/**
|
|
762
|
+
* Decompress data using the specified codec
|
|
763
|
+
*
|
|
764
|
+
* @param data - Compressed data
|
|
765
|
+
* @param codec - Compression codec identifier
|
|
766
|
+
* @returns Decompressed data
|
|
767
|
+
* @throws {UnsupportedCompressionError} If the codec is not supported
|
|
768
|
+
*/
|
|
769
|
+
async decompress(data: Uint8Array, codec: number): Promise<Uint8Array> {
|
|
770
|
+
switch (codec) {
|
|
771
|
+
case CompressionCodec.UNCOMPRESSED:
|
|
772
|
+
return data
|
|
773
|
+
|
|
774
|
+
case CompressionCodec.GZIP:
|
|
775
|
+
return this.decompressGzip(data)
|
|
776
|
+
|
|
777
|
+
case CompressionCodec.SNAPPY:
|
|
778
|
+
return this.decompressSnappy(data)
|
|
779
|
+
|
|
780
|
+
case CompressionCodec.LZ4:
|
|
781
|
+
case CompressionCodec.LZ4_RAW:
|
|
782
|
+
parquetLogger.warn('LZ4 decompression not implemented, returning raw data')
|
|
783
|
+
return data
|
|
784
|
+
|
|
785
|
+
case CompressionCodec.ZSTD:
|
|
786
|
+
parquetLogger.warn('ZSTD decompression not implemented, returning raw data')
|
|
787
|
+
return data
|
|
788
|
+
|
|
789
|
+
case CompressionCodec.LZO:
|
|
790
|
+
throw new UnsupportedCompressionError(codec)
|
|
791
|
+
|
|
792
|
+
default:
|
|
793
|
+
throw new UnsupportedCompressionError(codec)
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
/**
|
|
798
|
+
* Decompress GZIP-compressed data using the native DecompressionStream API
|
|
799
|
+
*
|
|
800
|
+
* @param data - GZIP-compressed data
|
|
801
|
+
* @returns Decompressed data
|
|
802
|
+
*/
|
|
803
|
+
private async decompressGzip(data: Uint8Array): Promise<Uint8Array> {
|
|
804
|
+
try {
|
|
805
|
+
const ds = new DecompressionStream('gzip')
|
|
806
|
+
const blob = new Blob([data])
|
|
807
|
+
const decompressedStream = blob.stream().pipeThrough(ds)
|
|
808
|
+
const decompressed = await new Response(decompressedStream).arrayBuffer()
|
|
809
|
+
return new Uint8Array(decompressed)
|
|
810
|
+
} catch (error) {
|
|
811
|
+
throw new ParquetParseError(
|
|
812
|
+
`GZIP decompression failed: ${error instanceof Error ? error.message : String(error)}`
|
|
813
|
+
)
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* Decompress Snappy-compressed data
|
|
819
|
+
*
|
|
820
|
+
* Implements the Snappy framing format for decompression.
|
|
821
|
+
*
|
|
822
|
+
* @param data - Snappy-compressed data
|
|
823
|
+
* @returns Decompressed data
|
|
824
|
+
*/
|
|
825
|
+
private decompressSnappy(data: Uint8Array): Uint8Array {
|
|
826
|
+
if (data.length === 0) return data
|
|
827
|
+
|
|
828
|
+
let pos = 0
|
|
829
|
+
|
|
830
|
+
// Read uncompressed length (varint)
|
|
831
|
+
let uncompressedLength = 0
|
|
832
|
+
let shift = 0
|
|
833
|
+
while (pos < data.length) {
|
|
834
|
+
const byte = data[pos]!
|
|
835
|
+
uncompressedLength |= (byte & 0x7f) << shift
|
|
836
|
+
pos++
|
|
837
|
+
if ((byte & 0x80) === 0) break
|
|
838
|
+
shift += 7
|
|
839
|
+
if (shift > 28) {
|
|
840
|
+
throw new ParquetParseError('Snappy: invalid varint encoding for uncompressed length')
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
const output = new Uint8Array(uncompressedLength)
|
|
845
|
+
let outPos = 0
|
|
846
|
+
|
|
847
|
+
while (pos < data.length && outPos < uncompressedLength) {
|
|
848
|
+
const tag = data[pos]!
|
|
849
|
+
pos++
|
|
850
|
+
const elementType = tag & 0x03
|
|
851
|
+
|
|
852
|
+
if (elementType === 0) {
|
|
853
|
+
// Literal
|
|
854
|
+
let length: number
|
|
855
|
+
const lengthMod = (tag >> 2) & 0x3f
|
|
856
|
+
if (lengthMod < 60) {
|
|
857
|
+
length = lengthMod + 1
|
|
858
|
+
} else {
|
|
859
|
+
const extraBytes = lengthMod - 59
|
|
860
|
+
length = 1
|
|
861
|
+
for (let i = 0; i < extraBytes && pos < data.length; i++) {
|
|
862
|
+
length += data[pos]! << (i * 8)
|
|
863
|
+
pos++
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
for (let i = 0; i < length && pos < data.length && outPos < uncompressedLength; i++) {
|
|
867
|
+
output[outPos++] = data[pos++]!
|
|
868
|
+
}
|
|
869
|
+
} else {
|
|
870
|
+
// Copy (back-reference)
|
|
871
|
+
let offset: number
|
|
872
|
+
let length: number
|
|
873
|
+
|
|
874
|
+
if (elementType === 1) {
|
|
875
|
+
// 1-byte offset
|
|
876
|
+
length = ((tag >> 2) & 0x07) + 4
|
|
877
|
+
offset = ((tag >> 5) << 8) | data[pos]!
|
|
878
|
+
pos++
|
|
879
|
+
} else if (elementType === 2) {
|
|
880
|
+
// 2-byte offset
|
|
881
|
+
length = (tag >> 2) + 1
|
|
882
|
+
offset = data[pos]! | (data[pos + 1]! << 8)
|
|
883
|
+
pos += 2
|
|
884
|
+
} else {
|
|
885
|
+
// 4-byte offset
|
|
886
|
+
length = (tag >> 2) + 1
|
|
887
|
+
offset = data[pos]! | (data[pos + 1]! << 8) | (data[pos + 2]! << 16) | (data[pos + 3]! << 24)
|
|
888
|
+
pos += 4
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
const srcPos = outPos - offset
|
|
892
|
+
if (srcPos < 0) {
|
|
893
|
+
throw new ParquetParseError(
|
|
894
|
+
`Snappy: invalid back-reference (offset=${offset}, position=${outPos})`
|
|
895
|
+
)
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
for (let i = 0; i < length && outPos < uncompressedLength; i++) {
|
|
899
|
+
output[outPos] = output[srcPos + i]!
|
|
900
|
+
outPos++
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
return output.slice(0, outPos)
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
/**
|
|
909
|
+
* Compare two Uint8Arrays for equality
|
|
910
|
+
*
|
|
911
|
+
* @param a - First array
|
|
912
|
+
* @param b - Second array
|
|
913
|
+
* @returns true if arrays are equal, false otherwise
|
|
914
|
+
*/
|
|
915
|
+
private bytesEqual(a: Uint8Array, b: Uint8Array): boolean {
|
|
916
|
+
if (a.length !== b.length) return false
|
|
917
|
+
for (let i = 0; i < a.length; i++) {
|
|
918
|
+
if (a[i] !== b[i]) return false
|
|
919
|
+
}
|
|
920
|
+
return true
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
/**
|
|
924
|
+
* Get human-readable name for a compression codec
|
|
925
|
+
*
|
|
926
|
+
* @param codec - Compression codec identifier
|
|
927
|
+
* @returns Codec name string
|
|
928
|
+
*/
|
|
929
|
+
private getCodecName(codec: number): string {
|
|
930
|
+
const names: Record<number, string> = {
|
|
931
|
+
[CompressionCodec.UNCOMPRESSED]: 'UNCOMPRESSED',
|
|
932
|
+
[CompressionCodec.SNAPPY]: 'SNAPPY',
|
|
933
|
+
[CompressionCodec.GZIP]: 'GZIP',
|
|
934
|
+
[CompressionCodec.LZO]: 'LZO',
|
|
935
|
+
[CompressionCodec.BROTLI]: 'BROTLI',
|
|
936
|
+
[CompressionCodec.LZ4]: 'LZ4',
|
|
937
|
+
[CompressionCodec.ZSTD]: 'ZSTD',
|
|
938
|
+
[CompressionCodec.LZ4_RAW]: 'LZ4_RAW',
|
|
939
|
+
}
|
|
940
|
+
return names[codec] ?? `UNKNOWN(${codec})`
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
// ============================================================================
|
|
945
|
+
// Factory Function
|
|
946
|
+
// ============================================================================
|
|
947
|
+
|
|
948
|
+
/**
|
|
949
|
+
* Create a new Parquet parser instance
|
|
950
|
+
*
|
|
951
|
+
* @param config - Optional parser configuration
|
|
952
|
+
* @returns A new ParquetParser instance
|
|
953
|
+
*
|
|
954
|
+
* @example
|
|
955
|
+
* ```typescript
|
|
956
|
+
* // Basic usage
|
|
957
|
+
* const parser = createParquetParser()
|
|
958
|
+
* const entries = await parser.parse(buffer)
|
|
959
|
+
*
|
|
960
|
+
* // With configuration
|
|
961
|
+
* const parser = createParquetParser({
|
|
962
|
+
* enableStreaming: true,
|
|
963
|
+
* continueOnError: true,
|
|
964
|
+
* collectMetrics: true,
|
|
965
|
+
* })
|
|
966
|
+
*
|
|
967
|
+
* const result = await parser.parseWithMetrics(buffer)
|
|
968
|
+
* console.log(`Parsed ${result.entries.length} entries`)
|
|
969
|
+
* console.log(`Throughput: ${result.metrics?.throughputMBps.toFixed(2)} MB/s`)
|
|
970
|
+
* ```
|
|
971
|
+
*/
|
|
972
|
+
export function createParquetParser(config?: ParquetParserConfig): ParquetParser {
|
|
973
|
+
return new ParquetParser(config)
|
|
974
|
+
}
|