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