spindb 0.37.2 → 0.38.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/dist/cli/bin.js +9 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/attach.js +102 -0
- package/dist/cli/commands/attach.js.map +1 -0
- package/dist/cli/commands/backup.js +197 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/backups.js +190 -0
- package/dist/cli/commands/backups.js.map +1 -0
- package/dist/cli/commands/clone.js +119 -0
- package/dist/cli/commands/clone.js.map +1 -0
- package/dist/cli/commands/config.js +276 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/connect.js +559 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/create.js +952 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/databases.js +485 -0
- package/dist/cli/commands/databases.js.map +1 -0
- package/dist/cli/commands/delete.js +106 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/deps.js +238 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/detach.js +81 -0
- package/dist/cli/commands/detach.js.map +1 -0
- package/dist/cli/commands/doctor.js +567 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/duckdb.js +207 -0
- package/dist/cli/commands/duckdb.js.map +1 -0
- package/dist/cli/commands/edit.js +524 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/engines.js +1414 -0
- package/dist/cli/commands/engines.js.map +1 -0
- package/dist/cli/commands/export.js +383 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/info.js +270 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/list.js +215 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/logs.js +81 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/menu/backup-handlers.js +1202 -0
- package/dist/cli/commands/menu/backup-handlers.js.map +1 -0
- package/dist/cli/commands/menu/container-handlers.js +1788 -0
- package/dist/cli/commands/menu/container-handlers.js.map +1 -0
- package/dist/cli/commands/menu/engine-handlers.js +235 -0
- package/dist/cli/commands/menu/engine-handlers.js.map +1 -0
- package/dist/cli/commands/menu/index.js +266 -0
- package/dist/cli/commands/menu/index.js.map +1 -0
- package/dist/cli/commands/menu/settings-handlers.js +320 -0
- package/dist/cli/commands/menu/settings-handlers.js.map +1 -0
- package/dist/cli/commands/menu/shared.js +13 -0
- package/dist/cli/commands/menu/shared.js.map +1 -0
- package/dist/cli/commands/menu/shell-handlers.js +1573 -0
- package/dist/cli/commands/menu/shell-handlers.js.map +1 -0
- package/dist/cli/commands/menu/sql-handlers.js +185 -0
- package/dist/cli/commands/menu/sql-handlers.js.map +1 -0
- package/dist/cli/commands/menu/update-handlers.js +322 -0
- package/dist/cli/commands/menu/update-handlers.js.map +1 -0
- package/dist/cli/commands/menu/validators.js +9 -0
- package/dist/cli/commands/menu/validators.js.map +1 -0
- package/dist/cli/commands/ports.js +166 -0
- package/dist/cli/commands/ports.js.map +1 -0
- package/dist/cli/commands/pull.js +166 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/query.js +180 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/restore.js +428 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/run.js +115 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/self-update.js +99 -0
- package/dist/cli/commands/self-update.js.map +1 -0
- package/dist/cli/commands/sqlite.js +207 -0
- package/dist/cli/commands/sqlite.js.map +1 -0
- package/dist/cli/commands/start.js +196 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stop.js +182 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/url.js +88 -0
- package/dist/cli/commands/url.js.map +1 -0
- package/dist/cli/commands/users.js +189 -0
- package/dist/cli/commands/users.js.map +1 -0
- package/dist/cli/commands/version.js +52 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/which.js +258 -0
- package/dist/cli/commands/which.js.map +1 -0
- package/dist/cli/constants.js +212 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/helpers.js +1120 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.js +146 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/prompts.js +1002 -0
- package/dist/cli/ui/prompts.js.map +1 -0
- package/dist/cli/ui/spinner.js +74 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/theme.js +99 -0
- package/dist/cli/ui/theme.js.map +1 -0
- package/dist/cli/utils/file-follower.js +79 -0
- package/dist/cli/utils/file-follower.js.map +1 -0
- package/dist/config/backup-formats.js +363 -0
- package/dist/config/backup-formats.js.map +1 -0
- package/dist/config/defaults.js +25 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/engine-defaults.js +303 -0
- package/dist/config/engine-defaults.js.map +1 -0
- package/dist/config/engines-registry.js +103 -0
- package/dist/config/engines-registry.js.map +1 -0
- package/dist/config/os-dependencies.js +767 -0
- package/dist/config/os-dependencies.js.map +1 -0
- package/dist/config/paths.js +156 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/version.js +3 -0
- package/dist/config/version.js.map +1 -0
- package/dist/core/backup-restore.js +219 -0
- package/dist/core/backup-restore.js.map +1 -0
- package/dist/core/base-binary-manager.js +403 -0
- package/dist/core/base-binary-manager.js.map +1 -0
- package/dist/core/base-document-binary-manager.js +364 -0
- package/dist/core/base-document-binary-manager.js.map +1 -0
- package/dist/core/base-embedded-binary-manager.js +364 -0
- package/dist/core/base-embedded-binary-manager.js.map +1 -0
- package/dist/core/base-server-binary-manager.js +368 -0
- package/dist/core/base-server-binary-manager.js.map +1 -0
- package/dist/core/config-manager.js +495 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/container-manager.js +609 -0
- package/dist/core/container-manager.js.map +1 -0
- package/dist/core/credential-generator.js +67 -0
- package/dist/core/credential-generator.js.map +1 -0
- package/dist/core/credential-manager.js +211 -0
- package/dist/core/credential-manager.js.map +1 -0
- package/dist/core/dblab-utils.js +105 -0
- package/dist/core/dblab-utils.js.map +1 -0
- package/dist/core/dependency-manager.js +359 -0
- package/dist/core/dependency-manager.js.map +1 -0
- package/dist/core/docker-exporter.js +1077 -0
- package/dist/core/docker-exporter.js.map +1 -0
- package/dist/core/error-handler.js +295 -0
- package/dist/core/error-handler.js.map +1 -0
- package/dist/core/fs-error-utils.js +74 -0
- package/dist/core/fs-error-utils.js.map +1 -0
- package/dist/core/homebrew-version-manager.js +280 -0
- package/dist/core/homebrew-version-manager.js.map +1 -0
- package/dist/core/hostdb-client.js +252 -0
- package/dist/core/hostdb-client.js.map +1 -0
- package/dist/core/hostdb-metadata.js +243 -0
- package/dist/core/hostdb-metadata.js.map +1 -0
- package/dist/core/hostdb-releases-factory.js +161 -0
- package/dist/core/hostdb-releases-factory.js.map +1 -0
- package/dist/core/library-env.js +88 -0
- package/dist/core/library-env.js.map +1 -0
- package/dist/core/pgweb-utils.js +53 -0
- package/dist/core/pgweb-utils.js.map +1 -0
- package/dist/core/platform-service.js +632 -0
- package/dist/core/platform-service.js.map +1 -0
- package/dist/core/port-manager.js +136 -0
- package/dist/core/port-manager.js.map +1 -0
- package/dist/core/process-manager.js +445 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/pull-manager.js +418 -0
- package/dist/core/pull-manager.js.map +1 -0
- package/dist/core/query-parser.js +449 -0
- package/dist/core/query-parser.js.map +1 -0
- package/dist/core/spawn-utils.js +90 -0
- package/dist/core/spawn-utils.js.map +1 -0
- package/dist/core/start-with-retry.js +90 -0
- package/dist/core/start-with-retry.js.map +1 -0
- package/dist/core/test-cleanup.js +85 -0
- package/dist/core/test-cleanup.js.map +1 -0
- package/dist/core/tls-generator.js +84 -0
- package/dist/core/tls-generator.js.map +1 -0
- package/dist/core/transaction-manager.js +139 -0
- package/dist/core/transaction-manager.js.map +1 -0
- package/dist/core/update-manager.js +241 -0
- package/dist/core/update-manager.js.map +1 -0
- package/dist/core/version-migration.js +260 -0
- package/dist/core/version-migration.js.map +1 -0
- package/dist/core/version-utils.js +91 -0
- package/dist/core/version-utils.js.map +1 -0
- package/dist/engines/base-engine.js +179 -0
- package/dist/engines/base-engine.js.map +1 -0
- package/dist/engines/clickhouse/backup.js +289 -0
- package/dist/engines/clickhouse/backup.js.map +1 -0
- package/dist/engines/clickhouse/binary-manager.js +145 -0
- package/dist/engines/clickhouse/binary-manager.js.map +1 -0
- package/dist/engines/clickhouse/binary-urls.js +100 -0
- package/dist/engines/clickhouse/binary-urls.js.map +1 -0
- package/dist/engines/clickhouse/cli-utils.js +143 -0
- package/dist/engines/clickhouse/cli-utils.js.map +1 -0
- package/dist/engines/clickhouse/hostdb-releases.js +24 -0
- package/dist/engines/clickhouse/hostdb-releases.js.map +1 -0
- package/dist/engines/clickhouse/index.js +1077 -0
- package/dist/engines/clickhouse/index.js.map +1 -0
- package/dist/engines/clickhouse/restore.js +335 -0
- package/dist/engines/clickhouse/restore.js.map +1 -0
- package/dist/engines/clickhouse/version-maps.js +83 -0
- package/dist/engines/clickhouse/version-maps.js.map +1 -0
- package/dist/engines/clickhouse/version-validator.js +133 -0
- package/dist/engines/clickhouse/version-validator.js.map +1 -0
- package/dist/engines/cockroachdb/backup.js +261 -0
- package/dist/engines/cockroachdb/backup.js.map +1 -0
- package/dist/engines/cockroachdb/binary-manager.js +33 -0
- package/dist/engines/cockroachdb/binary-manager.js.map +1 -0
- package/dist/engines/cockroachdb/binary-urls.js +33 -0
- package/dist/engines/cockroachdb/binary-urls.js.map +1 -0
- package/dist/engines/cockroachdb/cli-utils.js +338 -0
- package/dist/engines/cockroachdb/cli-utils.js.map +1 -0
- package/dist/engines/cockroachdb/hostdb-releases.js +21 -0
- package/dist/engines/cockroachdb/hostdb-releases.js.map +1 -0
- package/dist/engines/cockroachdb/index.js +1016 -0
- package/dist/engines/cockroachdb/index.js.map +1 -0
- package/dist/engines/cockroachdb/restore.js +323 -0
- package/dist/engines/cockroachdb/restore.js.map +1 -0
- package/dist/engines/cockroachdb/version-maps.js +37 -0
- package/dist/engines/cockroachdb/version-maps.js.map +1 -0
- package/dist/engines/couchdb/api-client.js +64 -0
- package/dist/engines/couchdb/api-client.js.map +1 -0
- package/dist/engines/couchdb/backup.js +90 -0
- package/dist/engines/couchdb/backup.js.map +1 -0
- package/dist/engines/couchdb/binary-manager.js +62 -0
- package/dist/engines/couchdb/binary-manager.js.map +1 -0
- package/dist/engines/couchdb/binary-urls.js +92 -0
- package/dist/engines/couchdb/binary-urls.js.map +1 -0
- package/dist/engines/couchdb/hostdb-releases.js +21 -0
- package/dist/engines/couchdb/hostdb-releases.js.map +1 -0
- package/dist/engines/couchdb/index.js +1043 -0
- package/dist/engines/couchdb/index.js.map +1 -0
- package/dist/engines/couchdb/restore.js +198 -0
- package/dist/engines/couchdb/restore.js.map +1 -0
- package/dist/engines/couchdb/version-maps.js +67 -0
- package/dist/engines/couchdb/version-maps.js.map +1 -0
- package/dist/engines/couchdb/version-validator.js +88 -0
- package/dist/engines/couchdb/version-validator.js.map +1 -0
- package/dist/engines/duckdb/binary-manager.js +33 -0
- package/dist/engines/duckdb/binary-manager.js.map +1 -0
- package/{engines/duckdb/binary-urls.ts → dist/engines/duckdb/binary-urls.js} +11 -16
- package/dist/engines/duckdb/binary-urls.js.map +1 -0
- package/dist/engines/duckdb/hostdb-releases.js +21 -0
- package/dist/engines/duckdb/hostdb-releases.js.map +1 -0
- package/dist/engines/duckdb/index.js +594 -0
- package/dist/engines/duckdb/index.js.map +1 -0
- package/dist/engines/duckdb/registry.js +265 -0
- package/dist/engines/duckdb/registry.js.map +1 -0
- package/dist/engines/duckdb/scanner.js +12 -0
- package/dist/engines/duckdb/scanner.js.map +1 -0
- package/dist/engines/duckdb/version-maps.js +67 -0
- package/dist/engines/duckdb/version-maps.js.map +1 -0
- package/dist/engines/duckdb/version-validator.js +62 -0
- package/dist/engines/duckdb/version-validator.js.map +1 -0
- package/dist/engines/ferretdb/backup.js +170 -0
- package/dist/engines/ferretdb/backup.js.map +1 -0
- package/dist/engines/ferretdb/binary-manager.js +765 -0
- package/dist/engines/ferretdb/binary-manager.js.map +1 -0
- package/dist/engines/ferretdb/binary-urls.js +135 -0
- package/dist/engines/ferretdb/binary-urls.js.map +1 -0
- package/dist/engines/ferretdb/index.js +1517 -0
- package/dist/engines/ferretdb/index.js.map +1 -0
- package/dist/engines/ferretdb/restore.js +310 -0
- package/dist/engines/ferretdb/restore.js.map +1 -0
- package/{engines/ferretdb/version-maps.ts → dist/engines/ferretdb/version-maps.js} +62 -79
- package/dist/engines/ferretdb/version-maps.js.map +1 -0
- package/dist/engines/file-based-utils.js +184 -0
- package/dist/engines/file-based-utils.js.map +1 -0
- package/dist/engines/index.js +124 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/influxdb/api-client.js +54 -0
- package/dist/engines/influxdb/api-client.js.map +1 -0
- package/dist/engines/influxdb/backup.js +119 -0
- package/dist/engines/influxdb/backup.js.map +1 -0
- package/dist/engines/influxdb/binary-manager.js +87 -0
- package/dist/engines/influxdb/binary-manager.js.map +1 -0
- package/dist/engines/influxdb/binary-urls.js +56 -0
- package/dist/engines/influxdb/binary-urls.js.map +1 -0
- package/dist/engines/influxdb/hostdb-releases.js +21 -0
- package/dist/engines/influxdb/hostdb-releases.js.map +1 -0
- package/dist/engines/influxdb/index.js +962 -0
- package/dist/engines/influxdb/index.js.map +1 -0
- package/dist/engines/influxdb/restore.js +329 -0
- package/dist/engines/influxdb/restore.js.map +1 -0
- package/dist/engines/influxdb/version-maps.js +64 -0
- package/dist/engines/influxdb/version-maps.js.map +1 -0
- package/dist/engines/influxdb/version-validator.js +109 -0
- package/dist/engines/influxdb/version-validator.js.map +1 -0
- package/dist/engines/mariadb/backup.js +178 -0
- package/dist/engines/mariadb/backup.js.map +1 -0
- package/dist/engines/mariadb/binary-manager.js +33 -0
- package/dist/engines/mariadb/binary-manager.js.map +1 -0
- package/{engines/mariadb/binary-urls.ts → dist/engines/mariadb/binary-urls.js} +38 -55
- package/dist/engines/mariadb/binary-urls.js.map +1 -0
- package/dist/engines/mariadb/hostdb-releases.js +21 -0
- package/dist/engines/mariadb/hostdb-releases.js.map +1 -0
- package/dist/engines/mariadb/index.js +1011 -0
- package/dist/engines/mariadb/index.js.map +1 -0
- package/dist/engines/mariadb/restore.js +322 -0
- package/dist/engines/mariadb/restore.js.map +1 -0
- package/dist/engines/mariadb/version-maps.js +63 -0
- package/dist/engines/mariadb/version-maps.js.map +1 -0
- package/dist/engines/mariadb/version-validator.js +143 -0
- package/dist/engines/mariadb/version-validator.js.map +1 -0
- package/dist/engines/meilisearch/api-client.js +50 -0
- package/dist/engines/meilisearch/api-client.js.map +1 -0
- package/dist/engines/meilisearch/backup.js +167 -0
- package/dist/engines/meilisearch/backup.js.map +1 -0
- package/dist/engines/meilisearch/binary-manager.js +31 -0
- package/dist/engines/meilisearch/binary-manager.js.map +1 -0
- package/dist/engines/meilisearch/binary-urls.js +56 -0
- package/dist/engines/meilisearch/binary-urls.js.map +1 -0
- package/dist/engines/meilisearch/hostdb-releases.js +21 -0
- package/dist/engines/meilisearch/hostdb-releases.js.map +1 -0
- package/dist/engines/meilisearch/index.js +992 -0
- package/dist/engines/meilisearch/index.js.map +1 -0
- package/dist/engines/meilisearch/restore.js +167 -0
- package/dist/engines/meilisearch/restore.js.map +1 -0
- package/dist/engines/meilisearch/version-maps.js +67 -0
- package/dist/engines/meilisearch/version-maps.js.map +1 -0
- package/dist/engines/meilisearch/version-validator.js +109 -0
- package/dist/engines/meilisearch/version-validator.js.map +1 -0
- package/dist/engines/mongodb/backup.js +109 -0
- package/dist/engines/mongodb/backup.js.map +1 -0
- package/dist/engines/mongodb/binary-manager.js +36 -0
- package/dist/engines/mongodb/binary-manager.js.map +1 -0
- package/dist/engines/mongodb/binary-urls.js +46 -0
- package/dist/engines/mongodb/binary-urls.js.map +1 -0
- package/dist/engines/mongodb/cli-utils.js +131 -0
- package/dist/engines/mongodb/cli-utils.js.map +1 -0
- package/dist/engines/mongodb/hostdb-releases.js +77 -0
- package/dist/engines/mongodb/hostdb-releases.js.map +1 -0
- package/dist/engines/mongodb/index.js +873 -0
- package/dist/engines/mongodb/index.js.map +1 -0
- package/dist/engines/mongodb/restore.js +276 -0
- package/dist/engines/mongodb/restore.js.map +1 -0
- package/dist/engines/mongodb/version-maps.js +79 -0
- package/dist/engines/mongodb/version-maps.js.map +1 -0
- package/dist/engines/mongodb/version-validator.js +133 -0
- package/dist/engines/mongodb/version-validator.js.map +1 -0
- package/dist/engines/mysql/backup.js +210 -0
- package/dist/engines/mysql/backup.js.map +1 -0
- package/dist/engines/mysql/binary-detection.js +325 -0
- package/dist/engines/mysql/binary-detection.js.map +1 -0
- package/dist/engines/mysql/binary-manager.js +30 -0
- package/dist/engines/mysql/binary-manager.js.map +1 -0
- package/dist/engines/mysql/binary-urls.js +87 -0
- package/dist/engines/mysql/binary-urls.js.map +1 -0
- package/{engines/mysql/hostdb-releases.ts → dist/engines/mysql/hostdb-releases.js} +20 -23
- package/dist/engines/mysql/hostdb-releases.js.map +1 -0
- package/dist/engines/mysql/index.js +1066 -0
- package/dist/engines/mysql/index.js.map +1 -0
- package/dist/engines/mysql/restore.js +361 -0
- package/dist/engines/mysql/restore.js.map +1 -0
- package/dist/engines/mysql/version-maps.js +79 -0
- package/dist/engines/mysql/version-maps.js.map +1 -0
- package/dist/engines/mysql/version-validator.js +266 -0
- package/dist/engines/mysql/version-validator.js.map +1 -0
- package/dist/engines/postgresql/backup.js +118 -0
- package/dist/engines/postgresql/backup.js.map +1 -0
- package/dist/engines/postgresql/binary-manager.js +85 -0
- package/dist/engines/postgresql/binary-manager.js.map +1 -0
- package/dist/engines/postgresql/binary-urls.js +80 -0
- package/dist/engines/postgresql/binary-urls.js.map +1 -0
- package/dist/engines/postgresql/hostdb-releases.js +21 -0
- package/dist/engines/postgresql/hostdb-releases.js.map +1 -0
- package/dist/engines/postgresql/index.js +852 -0
- package/dist/engines/postgresql/index.js.map +1 -0
- package/dist/engines/postgresql/remote-version.js +109 -0
- package/dist/engines/postgresql/remote-version.js.map +1 -0
- package/dist/engines/postgresql/restore.js +254 -0
- package/dist/engines/postgresql/restore.js.map +1 -0
- package/dist/engines/postgresql/version-maps.js +73 -0
- package/dist/engines/postgresql/version-maps.js.map +1 -0
- package/dist/engines/postgresql/version-validator.js +286 -0
- package/dist/engines/postgresql/version-validator.js.map +1 -0
- package/dist/engines/qdrant/api-client.js +50 -0
- package/dist/engines/qdrant/api-client.js.map +1 -0
- package/dist/engines/qdrant/backup.js +115 -0
- package/dist/engines/qdrant/backup.js.map +1 -0
- package/dist/engines/qdrant/binary-manager.js +31 -0
- package/dist/engines/qdrant/binary-manager.js.map +1 -0
- package/dist/engines/qdrant/binary-urls.js +92 -0
- package/dist/engines/qdrant/binary-urls.js.map +1 -0
- package/dist/engines/qdrant/cli-utils.js +39 -0
- package/dist/engines/qdrant/cli-utils.js.map +1 -0
- package/dist/engines/qdrant/hostdb-releases.js +21 -0
- package/dist/engines/qdrant/hostdb-releases.js.map +1 -0
- package/dist/engines/qdrant/index.js +1002 -0
- package/dist/engines/qdrant/index.js.map +1 -0
- package/dist/engines/qdrant/restore.js +154 -0
- package/dist/engines/qdrant/restore.js.map +1 -0
- package/dist/engines/qdrant/version-maps.js +67 -0
- package/dist/engines/qdrant/version-maps.js.map +1 -0
- package/dist/engines/qdrant/version-validator.js +109 -0
- package/dist/engines/qdrant/version-validator.js.map +1 -0
- package/dist/engines/questdb/backup.js +191 -0
- package/dist/engines/questdb/backup.js.map +1 -0
- package/dist/engines/questdb/binary-manager.js +247 -0
- package/dist/engines/questdb/binary-manager.js.map +1 -0
- package/dist/engines/questdb/binary-urls.js +27 -0
- package/dist/engines/questdb/binary-urls.js.map +1 -0
- package/dist/engines/questdb/hostdb-releases.js +21 -0
- package/dist/engines/questdb/hostdb-releases.js.map +1 -0
- package/dist/engines/questdb/index.js +814 -0
- package/dist/engines/questdb/index.js.map +1 -0
- package/dist/engines/questdb/restore.js +202 -0
- package/dist/engines/questdb/restore.js.map +1 -0
- package/dist/engines/questdb/version-maps.js +33 -0
- package/dist/engines/questdb/version-maps.js.map +1 -0
- package/dist/engines/questdb/version-validator.js +99 -0
- package/dist/engines/questdb/version-validator.js.map +1 -0
- package/dist/engines/redis/backup.js +292 -0
- package/dist/engines/redis/backup.js.map +1 -0
- package/dist/engines/redis/binary-manager.js +32 -0
- package/dist/engines/redis/binary-manager.js.map +1 -0
- package/dist/engines/redis/binary-urls.js +96 -0
- package/dist/engines/redis/binary-urls.js.map +1 -0
- package/dist/engines/redis/cli-utils.js +38 -0
- package/dist/engines/redis/cli-utils.js.map +1 -0
- package/dist/engines/redis/hostdb-releases.js +21 -0
- package/dist/engines/redis/hostdb-releases.js.map +1 -0
- package/dist/engines/redis/index.js +1263 -0
- package/dist/engines/redis/index.js.map +1 -0
- package/dist/engines/redis/restore.js +338 -0
- package/dist/engines/redis/restore.js.map +1 -0
- package/dist/engines/redis/version-maps.js +70 -0
- package/dist/engines/redis/version-maps.js.map +1 -0
- package/dist/engines/redis/version-validator.js +109 -0
- package/dist/engines/redis/version-validator.js.map +1 -0
- package/dist/engines/sqlite/binary-manager.js +39 -0
- package/dist/engines/sqlite/binary-manager.js.map +1 -0
- package/{engines/sqlite/binary-urls.ts → dist/engines/sqlite/binary-urls.js} +11 -16
- package/dist/engines/sqlite/binary-urls.js.map +1 -0
- package/dist/engines/sqlite/hostdb-releases.js +21 -0
- package/dist/engines/sqlite/hostdb-releases.js.map +1 -0
- package/dist/engines/sqlite/index.js +493 -0
- package/dist/engines/sqlite/index.js.map +1 -0
- package/dist/engines/sqlite/registry.js +163 -0
- package/dist/engines/sqlite/registry.js.map +1 -0
- package/dist/engines/sqlite/scanner.js +12 -0
- package/dist/engines/sqlite/scanner.js.map +1 -0
- package/dist/engines/sqlite/version-maps.js +57 -0
- package/dist/engines/sqlite/version-maps.js.map +1 -0
- package/dist/engines/surrealdb/backup.js +97 -0
- package/dist/engines/surrealdb/backup.js.map +1 -0
- package/dist/engines/surrealdb/binary-manager.js +33 -0
- package/dist/engines/surrealdb/binary-manager.js.map +1 -0
- package/dist/engines/surrealdb/binary-urls.js +33 -0
- package/dist/engines/surrealdb/binary-urls.js.map +1 -0
- package/dist/engines/surrealdb/cli-utils.js +147 -0
- package/dist/engines/surrealdb/cli-utils.js.map +1 -0
- package/dist/engines/surrealdb/hostdb-releases.js +21 -0
- package/dist/engines/surrealdb/hostdb-releases.js.map +1 -0
- package/dist/engines/surrealdb/index.js +1022 -0
- package/dist/engines/surrealdb/index.js.map +1 -0
- package/dist/engines/surrealdb/restore.js +224 -0
- package/dist/engines/surrealdb/restore.js.map +1 -0
- package/dist/engines/surrealdb/version-maps.js +36 -0
- package/dist/engines/surrealdb/version-maps.js.map +1 -0
- package/dist/engines/tigerbeetle/backup.js +36 -0
- package/dist/engines/tigerbeetle/backup.js.map +1 -0
- package/dist/engines/tigerbeetle/binary-manager.js +72 -0
- package/dist/engines/tigerbeetle/binary-manager.js.map +1 -0
- package/dist/engines/tigerbeetle/binary-urls.js +49 -0
- package/dist/engines/tigerbeetle/binary-urls.js.map +1 -0
- package/dist/engines/tigerbeetle/hostdb-releases.js +21 -0
- package/dist/engines/tigerbeetle/hostdb-releases.js.map +1 -0
- package/dist/engines/tigerbeetle/index.js +559 -0
- package/dist/engines/tigerbeetle/index.js.map +1 -0
- package/dist/engines/tigerbeetle/restore.js +91 -0
- package/dist/engines/tigerbeetle/restore.js.map +1 -0
- package/{engines/tigerbeetle/version-maps.ts → dist/engines/tigerbeetle/version-maps.js} +22 -31
- package/dist/engines/tigerbeetle/version-maps.js.map +1 -0
- package/dist/engines/tigerbeetle/version-validator.js +108 -0
- package/dist/engines/tigerbeetle/version-validator.js.map +1 -0
- package/dist/engines/typedb/backup.js +129 -0
- package/dist/engines/typedb/backup.js.map +1 -0
- package/dist/engines/typedb/binary-manager.js +151 -0
- package/dist/engines/typedb/binary-manager.js.map +1 -0
- package/dist/engines/typedb/binary-urls.js +33 -0
- package/dist/engines/typedb/binary-urls.js.map +1 -0
- package/dist/engines/typedb/cli-utils.js +163 -0
- package/dist/engines/typedb/cli-utils.js.map +1 -0
- package/dist/engines/typedb/hostdb-releases.js +21 -0
- package/dist/engines/typedb/hostdb-releases.js.map +1 -0
- package/dist/engines/typedb/index.js +1003 -0
- package/dist/engines/typedb/index.js.map +1 -0
- package/dist/engines/typedb/restore.js +279 -0
- package/dist/engines/typedb/restore.js.map +1 -0
- package/dist/engines/typedb/version-maps.js +40 -0
- package/dist/engines/typedb/version-maps.js.map +1 -0
- package/dist/engines/typedb/version-validator.js +103 -0
- package/dist/engines/typedb/version-validator.js.map +1 -0
- package/dist/engines/valkey/backup.js +292 -0
- package/dist/engines/valkey/backup.js.map +1 -0
- package/dist/engines/valkey/binary-manager.js +33 -0
- package/dist/engines/valkey/binary-manager.js.map +1 -0
- package/dist/engines/valkey/binary-urls.js +98 -0
- package/dist/engines/valkey/binary-urls.js.map +1 -0
- package/dist/engines/valkey/cli-utils.js +38 -0
- package/dist/engines/valkey/cli-utils.js.map +1 -0
- package/dist/engines/valkey/hostdb-releases.js +21 -0
- package/dist/engines/valkey/hostdb-releases.js.map +1 -0
- package/dist/engines/valkey/index.js +1257 -0
- package/dist/engines/valkey/index.js.map +1 -0
- package/dist/engines/valkey/restore.js +340 -0
- package/dist/engines/valkey/restore.js.map +1 -0
- package/dist/engines/valkey/version-maps.js +70 -0
- package/dist/engines/valkey/version-maps.js.map +1 -0
- package/dist/engines/valkey/version-validator.js +112 -0
- package/dist/engines/valkey/version-validator.js.map +1 -0
- package/dist/engines/weaviate/api-client.js +50 -0
- package/dist/engines/weaviate/api-client.js.map +1 -0
- package/dist/engines/weaviate/backup.js +95 -0
- package/dist/engines/weaviate/backup.js.map +1 -0
- package/dist/engines/weaviate/binary-manager.js +58 -0
- package/dist/engines/weaviate/binary-manager.js.map +1 -0
- package/dist/engines/weaviate/binary-urls.js +92 -0
- package/dist/engines/weaviate/binary-urls.js.map +1 -0
- package/dist/engines/weaviate/cli-utils.js +39 -0
- package/dist/engines/weaviate/cli-utils.js.map +1 -0
- package/dist/engines/weaviate/hostdb-releases.js +21 -0
- package/dist/engines/weaviate/hostdb-releases.js.map +1 -0
- package/dist/engines/weaviate/index.js +871 -0
- package/dist/engines/weaviate/index.js.map +1 -0
- package/dist/engines/weaviate/restore.js +185 -0
- package/dist/engines/weaviate/restore.js.map +1 -0
- package/dist/engines/weaviate/version-maps.js +67 -0
- package/dist/engines/weaviate/version-maps.js.map +1 -0
- package/dist/engines/weaviate/version-validator.js +109 -0
- package/dist/engines/weaviate/version-validator.js.map +1 -0
- package/dist/types/index.js +102 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +12 -9
- package/bin/cli.js +0 -68
- package/cli/bin.ts +0 -10
- package/cli/commands/attach.ts +0 -139
- package/cli/commands/backup.ts +0 -290
- package/cli/commands/backups.ts +0 -247
- package/cli/commands/clone.ts +0 -159
- package/cli/commands/config.ts +0 -367
- package/cli/commands/connect.ts +0 -684
- package/cli/commands/create.ts +0 -1201
- package/cli/commands/databases.ts +0 -630
- package/cli/commands/delete.ts +0 -133
- package/cli/commands/deps.ts +0 -342
- package/cli/commands/detach.ts +0 -107
- package/cli/commands/doctor.ts +0 -689
- package/cli/commands/duckdb.ts +0 -273
- package/cli/commands/edit.ts +0 -683
- package/cli/commands/engines.ts +0 -1914
- package/cli/commands/export.ts +0 -544
- package/cli/commands/info.ts +0 -340
- package/cli/commands/list.ts +0 -284
- package/cli/commands/logs.ts +0 -102
- package/cli/commands/menu/backup-handlers.ts +0 -1571
- package/cli/commands/menu/container-handlers.ts +0 -2288
- package/cli/commands/menu/engine-handlers.ts +0 -355
- package/cli/commands/menu/index.ts +0 -342
- package/cli/commands/menu/settings-handlers.ts +0 -365
- package/cli/commands/menu/shared.ts +0 -23
- package/cli/commands/menu/shell-handlers.ts +0 -1811
- package/cli/commands/menu/sql-handlers.ts +0 -231
- package/cli/commands/menu/update-handlers.ts +0 -378
- package/cli/commands/menu/validators.ts +0 -8
- package/cli/commands/ports.ts +0 -211
- package/cli/commands/pull.ts +0 -223
- package/cli/commands/query.ts +0 -241
- package/cli/commands/restore.ts +0 -587
- package/cli/commands/run.ts +0 -178
- package/cli/commands/self-update.ts +0 -121
- package/cli/commands/sqlite.ts +0 -273
- package/cli/commands/start.ts +0 -218
- package/cli/commands/stop.ts +0 -241
- package/cli/commands/url.ts +0 -104
- package/cli/commands/users.ts +0 -264
- package/cli/commands/version.ts +0 -55
- package/cli/commands/which.ts +0 -290
- package/cli/constants.ts +0 -233
- package/cli/helpers.ts +0 -1593
- package/cli/index.ts +0 -162
- package/cli/ui/prompts.ts +0 -1525
- package/cli/ui/spinner.ts +0 -88
- package/cli/ui/theme.ts +0 -128
- package/cli/utils/file-follower.ts +0 -93
- package/config/backup-formats.ts +0 -446
- package/config/defaults.ts +0 -56
- package/config/engine-defaults.ts +0 -336
- package/config/engines-registry.ts +0 -150
- package/config/engines.schema.json +0 -135
- package/config/os-dependencies.ts +0 -888
- package/config/paths.ts +0 -200
- package/core/backup-restore.ts +0 -330
- package/core/base-binary-manager.ts +0 -562
- package/core/base-document-binary-manager.ts +0 -523
- package/core/base-embedded-binary-manager.ts +0 -547
- package/core/base-server-binary-manager.ts +0 -523
- package/core/config-manager.ts +0 -652
- package/core/container-manager.ts +0 -787
- package/core/credential-generator.ts +0 -93
- package/core/credential-manager.ts +0 -259
- package/core/dblab-utils.ts +0 -113
- package/core/dependency-manager.ts +0 -512
- package/core/docker-exporter.ts +0 -1345
- package/core/error-handler.ts +0 -419
- package/core/fs-error-utils.ts +0 -82
- package/core/homebrew-version-manager.ts +0 -352
- package/core/hostdb-client.ts +0 -344
- package/core/hostdb-metadata.ts +0 -350
- package/core/hostdb-releases-factory.ts +0 -237
- package/core/library-env.ts +0 -118
- package/core/pgweb-utils.ts +0 -62
- package/core/platform-service.ts +0 -829
- package/core/port-manager.ts +0 -165
- package/core/process-manager.ts +0 -576
- package/core/pull-manager.ts +0 -511
- package/core/query-parser.ts +0 -514
- package/core/spawn-utils.ts +0 -122
- package/core/start-with-retry.ts +0 -130
- package/core/test-cleanup.ts +0 -108
- package/core/tls-generator.ts +0 -116
- package/core/transaction-manager.ts +0 -158
- package/core/update-manager.ts +0 -308
- package/core/version-migration.ts +0 -346
- package/core/version-utils.ts +0 -104
- package/engines/base-engine.ts +0 -340
- package/engines/clickhouse/README.md +0 -231
- package/engines/clickhouse/backup.ts +0 -398
- package/engines/clickhouse/binary-manager.ts +0 -201
- package/engines/clickhouse/binary-urls.ts +0 -125
- package/engines/clickhouse/cli-utils.ts +0 -176
- package/engines/clickhouse/hostdb-releases.ts +0 -30
- package/engines/clickhouse/index.ts +0 -1345
- package/engines/clickhouse/restore.ts +0 -466
- package/engines/clickhouse/version-maps.ts +0 -95
- package/engines/clickhouse/version-validator.ts +0 -154
- package/engines/cockroachdb/README.md +0 -170
- package/engines/cockroachdb/backup.ts +0 -376
- package/engines/cockroachdb/binary-manager.ts +0 -45
- package/engines/cockroachdb/binary-urls.ts +0 -40
- package/engines/cockroachdb/cli-utils.ts +0 -384
- package/engines/cockroachdb/hostdb-releases.ts +0 -26
- package/engines/cockroachdb/index.ts +0 -1276
- package/engines/cockroachdb/restore.ts +0 -455
- package/engines/cockroachdb/version-maps.ts +0 -42
- package/engines/couchdb/README.md +0 -257
- package/engines/couchdb/api-client.ts +0 -81
- package/engines/couchdb/backup.ts +0 -137
- package/engines/couchdb/binary-manager.ts +0 -86
- package/engines/couchdb/binary-urls.ts +0 -115
- package/engines/couchdb/hostdb-releases.ts +0 -23
- package/engines/couchdb/index.ts +0 -1429
- package/engines/couchdb/restore.ts +0 -290
- package/engines/couchdb/version-maps.ts +0 -78
- package/engines/couchdb/version-validator.ts +0 -111
- package/engines/duckdb/README.md +0 -154
- package/engines/duckdb/binary-manager.ts +0 -45
- package/engines/duckdb/hostdb-releases.ts +0 -23
- package/engines/duckdb/index.ts +0 -749
- package/engines/duckdb/registry.ts +0 -303
- package/engines/duckdb/scanner.ts +0 -22
- package/engines/duckdb/version-maps.ts +0 -78
- package/engines/duckdb/version-validator.ts +0 -78
- package/engines/ferretdb/README.md +0 -262
- package/engines/ferretdb/backup.ts +0 -173
- package/engines/ferretdb/binary-manager.ts +0 -1095
- package/engines/ferretdb/binary-urls.ts +0 -183
- package/engines/ferretdb/index.ts +0 -1907
- package/engines/ferretdb/restore.ts +0 -357
- package/engines/file-based-utils.ts +0 -262
- package/engines/index.ts +0 -131
- package/engines/influxdb/README.md +0 -180
- package/engines/influxdb/api-client.ts +0 -64
- package/engines/influxdb/backup.ts +0 -160
- package/engines/influxdb/binary-manager.ts +0 -110
- package/engines/influxdb/binary-urls.ts +0 -69
- package/engines/influxdb/hostdb-releases.ts +0 -23
- package/engines/influxdb/index.ts +0 -1272
- package/engines/influxdb/restore.ts +0 -417
- package/engines/influxdb/version-maps.ts +0 -75
- package/engines/influxdb/version-validator.ts +0 -128
- package/engines/mariadb/README.md +0 -141
- package/engines/mariadb/backup.ts +0 -233
- package/engines/mariadb/binary-manager.ts +0 -45
- package/engines/mariadb/hostdb-releases.ts +0 -23
- package/engines/mariadb/index.ts +0 -1300
- package/engines/mariadb/restore.ts +0 -447
- package/engines/mariadb/version-maps.ts +0 -72
- package/engines/mariadb/version-validator.ts +0 -181
- package/engines/meilisearch/README.md +0 -255
- package/engines/meilisearch/api-client.ts +0 -61
- package/engines/meilisearch/backup.ts +0 -233
- package/engines/meilisearch/binary-manager.ts +0 -43
- package/engines/meilisearch/binary-urls.ts +0 -69
- package/engines/meilisearch/hostdb-releases.ts +0 -26
- package/engines/meilisearch/index.ts +0 -1292
- package/engines/meilisearch/restore.ts +0 -219
- package/engines/meilisearch/version-maps.ts +0 -78
- package/engines/meilisearch/version-validator.ts +0 -128
- package/engines/mongodb/README.md +0 -162
- package/engines/mongodb/backup.ts +0 -127
- package/engines/mongodb/binary-manager.ts +0 -48
- package/engines/mongodb/binary-urls.ts +0 -63
- package/engines/mongodb/cli-utils.ts +0 -171
- package/engines/mongodb/hostdb-releases.ts +0 -91
- package/engines/mongodb/index.ts +0 -1118
- package/engines/mongodb/restore.ts +0 -361
- package/engines/mongodb/version-maps.ts +0 -91
- package/engines/mongodb/version-validator.ts +0 -160
- package/engines/mysql/README.md +0 -142
- package/engines/mysql/backup.ts +0 -270
- package/engines/mysql/binary-detection.ts +0 -408
- package/engines/mysql/binary-manager.ts +0 -42
- package/engines/mysql/binary-urls.ts +0 -104
- package/engines/mysql/index.ts +0 -1361
- package/engines/mysql/restore.ts +0 -500
- package/engines/mysql/version-maps.ts +0 -91
- package/engines/mysql/version-validator.ts +0 -369
- package/engines/postgresql/README.md +0 -158
- package/engines/postgresql/backup.ts +0 -151
- package/engines/postgresql/binary-manager.ts +0 -114
- package/engines/postgresql/binary-urls.ts +0 -99
- package/engines/postgresql/hostdb-releases.ts +0 -26
- package/engines/postgresql/index.ts +0 -1143
- package/engines/postgresql/remote-version.ts +0 -161
- package/engines/postgresql/restore.ts +0 -342
- package/engines/postgresql/version-maps.ts +0 -83
- package/engines/postgresql/version-validator.ts +0 -413
- package/engines/qdrant/README.md +0 -222
- package/engines/qdrant/api-client.ts +0 -61
- package/engines/qdrant/backup.ts +0 -165
- package/engines/qdrant/binary-manager.ts +0 -43
- package/engines/qdrant/binary-urls.ts +0 -115
- package/engines/qdrant/cli-utils.ts +0 -43
- package/engines/qdrant/hostdb-releases.ts +0 -23
- package/engines/qdrant/index.ts +0 -1312
- package/engines/qdrant/restore.ts +0 -203
- package/engines/qdrant/version-maps.ts +0 -78
- package/engines/qdrant/version-validator.ts +0 -128
- package/engines/questdb/README.md +0 -334
- package/engines/questdb/backup.ts +0 -220
- package/engines/questdb/binary-manager.ts +0 -310
- package/engines/questdb/binary-urls.ts +0 -34
- package/engines/questdb/hostdb-releases.ts +0 -23
- package/engines/questdb/index.ts +0 -1023
- package/engines/questdb/restore.ts +0 -260
- package/engines/questdb/version-maps.ts +0 -37
- package/engines/questdb/version-validator.ts +0 -121
- package/engines/redis/README.md +0 -173
- package/engines/redis/backup.ts +0 -389
- package/engines/redis/binary-manager.ts +0 -44
- package/engines/redis/binary-urls.ts +0 -117
- package/engines/redis/cli-utils.ts +0 -42
- package/engines/redis/hostdb-releases.ts +0 -23
- package/engines/redis/index.ts +0 -1583
- package/engines/redis/restore.ts +0 -443
- package/engines/redis/version-maps.ts +0 -81
- package/engines/redis/version-validator.ts +0 -131
- package/engines/sqlite/README.md +0 -162
- package/engines/sqlite/binary-manager.ts +0 -52
- package/engines/sqlite/hostdb-releases.ts +0 -23
- package/engines/sqlite/index.ts +0 -641
- package/engines/sqlite/registry.ts +0 -198
- package/engines/sqlite/scanner.ts +0 -22
- package/engines/sqlite/version-maps.ts +0 -64
- package/engines/surrealdb/README.md +0 -218
- package/engines/surrealdb/backup.ts +0 -131
- package/engines/surrealdb/binary-manager.ts +0 -45
- package/engines/surrealdb/binary-urls.ts +0 -40
- package/engines/surrealdb/cli-utils.ts +0 -173
- package/engines/surrealdb/hostdb-releases.ts +0 -23
- package/engines/surrealdb/index.ts +0 -1246
- package/engines/surrealdb/restore.ts +0 -302
- package/engines/surrealdb/version-maps.ts +0 -41
- package/engines/tigerbeetle/README.md +0 -61
- package/engines/tigerbeetle/backup.ts +0 -49
- package/engines/tigerbeetle/binary-manager.ts +0 -95
- package/engines/tigerbeetle/binary-urls.ts +0 -62
- package/engines/tigerbeetle/hostdb-releases.ts +0 -26
- package/engines/tigerbeetle/index.ts +0 -746
- package/engines/tigerbeetle/restore.ts +0 -130
- package/engines/tigerbeetle/version-validator.ts +0 -126
- package/engines/typedb/backup.ts +0 -167
- package/engines/typedb/binary-manager.ts +0 -200
- package/engines/typedb/binary-urls.ts +0 -40
- package/engines/typedb/cli-utils.ts +0 -210
- package/engines/typedb/hostdb-releases.ts +0 -23
- package/engines/typedb/index.ts +0 -1275
- package/engines/typedb/restore.ts +0 -377
- package/engines/typedb/version-maps.ts +0 -48
- package/engines/typedb/version-validator.ts +0 -127
- package/engines/valkey/README.md +0 -219
- package/engines/valkey/backup.ts +0 -389
- package/engines/valkey/binary-manager.ts +0 -45
- package/engines/valkey/binary-urls.ts +0 -122
- package/engines/valkey/cli-utils.ts +0 -42
- package/engines/valkey/hostdb-releases.ts +0 -23
- package/engines/valkey/index.ts +0 -1585
- package/engines/valkey/restore.ts +0 -446
- package/engines/valkey/version-maps.ts +0 -81
- package/engines/valkey/version-validator.ts +0 -131
- package/engines/weaviate/README.md +0 -302
- package/engines/weaviate/api-client.ts +0 -61
- package/engines/weaviate/backup.ts +0 -145
- package/engines/weaviate/binary-manager.ts +0 -80
- package/engines/weaviate/binary-urls.ts +0 -115
- package/engines/weaviate/cli-utils.ts +0 -43
- package/engines/weaviate/hostdb-releases.ts +0 -23
- package/engines/weaviate/index.ts +0 -1139
- package/engines/weaviate/restore.ts +0 -235
- package/engines/weaviate/version-maps.ts +0 -78
- package/engines/weaviate/version-validator.ts +0 -128
- package/types/index.ts +0 -624
- /package/{config → dist/config}/engines.json +0 -0
|
@@ -1,1095 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FerretDB Composite Binary Manager
|
|
3
|
-
*
|
|
4
|
-
* Handles downloading and managing FerretDB binaries:
|
|
5
|
-
*
|
|
6
|
-
* v2 (default): Two binaries required:
|
|
7
|
-
* 1. ferretdb - The MongoDB-compatible Go proxy
|
|
8
|
-
* 2. postgresql-documentdb - PostgreSQL 17 with DocumentDB extension
|
|
9
|
-
*
|
|
10
|
-
* v1: Two binaries, but backend is shared:
|
|
11
|
-
* 1. ferretdb - The MongoDB-compatible Go proxy
|
|
12
|
-
* 2. Plain PostgreSQL - Managed by postgresqlBinaryManager (shared with standalone PG containers)
|
|
13
|
-
*
|
|
14
|
-
* This is a composite manager that coordinates the installation of both
|
|
15
|
-
* binaries, which are required for FerretDB to function.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import { createWriteStream, existsSync } from 'fs'
|
|
19
|
-
import { mkdir, readdir, rm, chmod, rename, cp } from 'fs/promises'
|
|
20
|
-
import { join } from 'path'
|
|
21
|
-
import { Readable } from 'stream'
|
|
22
|
-
import { pipeline } from 'stream/promises'
|
|
23
|
-
import { paths } from '../../config/paths'
|
|
24
|
-
import { spawnAsync, extractWindowsArchive } from '../../core/spawn-utils'
|
|
25
|
-
import { isRenameFallbackError } from '../../core/fs-error-utils'
|
|
26
|
-
import { logDebug } from '../../core/error-handler'
|
|
27
|
-
import { fetchWithRegistryFallback } from '../../core/hostdb-client'
|
|
28
|
-
import {
|
|
29
|
-
Engine,
|
|
30
|
-
Platform,
|
|
31
|
-
type Arch,
|
|
32
|
-
type ProgressCallback,
|
|
33
|
-
type InstalledBinary,
|
|
34
|
-
isValidPlatform,
|
|
35
|
-
isValidArch,
|
|
36
|
-
} from '../../types'
|
|
37
|
-
import {
|
|
38
|
-
normalizeVersion,
|
|
39
|
-
normalizeDocumentDBVersion,
|
|
40
|
-
DEFAULT_DOCUMENTDB_VERSION,
|
|
41
|
-
DEFAULT_V1_POSTGRESQL_VERSION,
|
|
42
|
-
isV1,
|
|
43
|
-
} from './version-maps'
|
|
44
|
-
import {
|
|
45
|
-
isPlatformSupported,
|
|
46
|
-
getFerretDBBinaryUrl,
|
|
47
|
-
getDocumentDBBinaryUrl,
|
|
48
|
-
} from './binary-urls'
|
|
49
|
-
import { postgresqlBinaryManager } from '../postgresql/binary-manager'
|
|
50
|
-
|
|
51
|
-
const DOWNLOAD_TIMEOUT_MS = 5 * 60 * 1000 // 5 minutes
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Result of ensuring both FerretDB binaries are installed
|
|
55
|
-
*/
|
|
56
|
-
export type FerretDBBinaryPaths = {
|
|
57
|
-
ferretdbPath: string // Path to ferretdb binary directory
|
|
58
|
-
backendPath: string // Path to backend binary directory (postgresql-documentdb for v2, postgresql for v1)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* FerretDB Composite Binary Manager
|
|
63
|
-
*
|
|
64
|
-
* Manages the installation of both required binaries for FerretDB.
|
|
65
|
-
*/
|
|
66
|
-
class FerretDBCompositeBinaryManager {
|
|
67
|
-
/**
|
|
68
|
-
* Check if the current platform supports FerretDB
|
|
69
|
-
* @param version - Optional version to check platform support for (v1 supports Windows, v2 does not)
|
|
70
|
-
*/
|
|
71
|
-
isPlatformSupported(
|
|
72
|
-
platform: Platform,
|
|
73
|
-
arch: Arch,
|
|
74
|
-
version?: string,
|
|
75
|
-
): boolean {
|
|
76
|
-
return isPlatformSupported(platform, arch, version)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Get the full version string for a FerretDB version
|
|
81
|
-
*/
|
|
82
|
-
getFullVersion(version: string): string {
|
|
83
|
-
return normalizeVersion(version)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Get the full version string for a postgresql-documentdb version
|
|
88
|
-
*/
|
|
89
|
-
getFullDocumentDBVersion(version: string): string {
|
|
90
|
-
return normalizeDocumentDBVersion(version)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Check if FerretDB binaries are installed for a specific version
|
|
95
|
-
*/
|
|
96
|
-
async isInstalled(
|
|
97
|
-
version: string,
|
|
98
|
-
platform: Platform,
|
|
99
|
-
arch: Arch,
|
|
100
|
-
backendVersion: string = DEFAULT_DOCUMENTDB_VERSION,
|
|
101
|
-
): Promise<boolean> {
|
|
102
|
-
const fullVersion = this.getFullVersion(version)
|
|
103
|
-
|
|
104
|
-
// Check FerretDB proxy
|
|
105
|
-
const ferretdbPath = this.getFerretDBBinaryPath(fullVersion, platform, arch)
|
|
106
|
-
const ext = platform === Platform.Win32 ? '.exe' : ''
|
|
107
|
-
const ferretdbBinary = join(ferretdbPath, 'bin', `ferretdb${ext}`)
|
|
108
|
-
if (!existsSync(ferretdbBinary)) {
|
|
109
|
-
return false
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Check backend
|
|
113
|
-
if (isV1(version)) {
|
|
114
|
-
// v1: check plain PostgreSQL via postgresqlBinaryManager
|
|
115
|
-
return postgresqlBinaryManager.isInstalled(
|
|
116
|
-
DEFAULT_V1_POSTGRESQL_VERSION,
|
|
117
|
-
platform,
|
|
118
|
-
arch,
|
|
119
|
-
)
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// v2: check postgresql-documentdb
|
|
123
|
-
const fullBackendVersion = this.getFullDocumentDBVersion(backendVersion)
|
|
124
|
-
const documentdbPath = this.getDocumentDBBinaryPath(
|
|
125
|
-
fullBackendVersion,
|
|
126
|
-
platform,
|
|
127
|
-
arch,
|
|
128
|
-
)
|
|
129
|
-
const pgCtlExt = platform === Platform.Win32 ? '.exe' : ''
|
|
130
|
-
const pgCtl = join(documentdbPath, 'bin', `pg_ctl${pgCtlExt}`)
|
|
131
|
-
if (!existsSync(pgCtl)) {
|
|
132
|
-
return false
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return true
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Get the path where FerretDB binaries would be installed
|
|
140
|
-
* @param version - Full normalized version (e.g., "2.7.0", not "2" or "2.7")
|
|
141
|
-
* @param platform - Operating system
|
|
142
|
-
* @param arch - Architecture
|
|
143
|
-
*/
|
|
144
|
-
getFerretDBBinaryPath(
|
|
145
|
-
version: string,
|
|
146
|
-
platform: Platform,
|
|
147
|
-
arch: Arch,
|
|
148
|
-
): string {
|
|
149
|
-
return join(paths.bin, `ferretdb-${version}-${platform}-${arch}`)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Get the path where postgresql-documentdb binaries would be installed
|
|
154
|
-
* @param version - Full normalized version (e.g., "17-0.107.0", not "17")
|
|
155
|
-
* @param platform - Operating system
|
|
156
|
-
* @param arch - Architecture
|
|
157
|
-
*/
|
|
158
|
-
getDocumentDBBinaryPath(
|
|
159
|
-
version: string,
|
|
160
|
-
platform: Platform,
|
|
161
|
-
arch: Arch,
|
|
162
|
-
): string {
|
|
163
|
-
return join(
|
|
164
|
-
paths.bin,
|
|
165
|
-
`postgresql-documentdb-${version}-${platform}-${arch}`,
|
|
166
|
-
)
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Get environment variables needed to run postgresql-documentdb binaries
|
|
171
|
-
*
|
|
172
|
-
* On Linux, the bundled binaries need LD_LIBRARY_PATH set to find libpq.so
|
|
173
|
-
* and other shared libraries in the lib/ directory.
|
|
174
|
-
*
|
|
175
|
-
* On macOS, the binaries use @loader_path which doesn't need env vars.
|
|
176
|
-
* On Windows, DLLs are found via PATH or same directory.
|
|
177
|
-
*
|
|
178
|
-
* @param version - Full normalized version (e.g., "17-0.107.0", not "17")
|
|
179
|
-
* @param platform - Operating system
|
|
180
|
-
* @param arch - Architecture
|
|
181
|
-
*/
|
|
182
|
-
getDocumentDBSpawnEnv(
|
|
183
|
-
version: string,
|
|
184
|
-
platform: Platform,
|
|
185
|
-
arch: Arch,
|
|
186
|
-
): Record<string, string> | undefined {
|
|
187
|
-
// Only Linux needs LD_LIBRARY_PATH
|
|
188
|
-
if (platform !== Platform.Linux) {
|
|
189
|
-
return undefined
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const documentdbPath = this.getDocumentDBBinaryPath(version, platform, arch)
|
|
193
|
-
const libPath = join(documentdbPath, 'lib')
|
|
194
|
-
|
|
195
|
-
// Prepend our lib path to any existing LD_LIBRARY_PATH
|
|
196
|
-
const existingLdPath = process.env['LD_LIBRARY_PATH'] || ''
|
|
197
|
-
const newLdPath = existingLdPath ? `${libPath}:${existingLdPath}` : libPath
|
|
198
|
-
|
|
199
|
-
return {
|
|
200
|
-
LD_LIBRARY_PATH: newLdPath,
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Get the backend binary directory path for a FerretDB version.
|
|
206
|
-
* For v1: returns the plain PostgreSQL binary path
|
|
207
|
-
* For v2: returns the postgresql-documentdb binary path
|
|
208
|
-
*
|
|
209
|
-
* @param ferretdbVersion - FerretDB version (e.g., "1.24.2" or "2.7.0")
|
|
210
|
-
* @param backendVersion - Backend version (PostgreSQL version for v1, DocumentDB version for v2)
|
|
211
|
-
* @param platform - Operating system
|
|
212
|
-
* @param arch - Architecture
|
|
213
|
-
*/
|
|
214
|
-
getBackendBinaryPath(
|
|
215
|
-
ferretdbVersion: string,
|
|
216
|
-
backendVersion: string,
|
|
217
|
-
platform: Platform,
|
|
218
|
-
arch: Arch,
|
|
219
|
-
): string {
|
|
220
|
-
if (isV1(ferretdbVersion)) {
|
|
221
|
-
const pgFullVersion = postgresqlBinaryManager.getFullVersion(
|
|
222
|
-
backendVersion || DEFAULT_V1_POSTGRESQL_VERSION,
|
|
223
|
-
)
|
|
224
|
-
return paths.getBinaryPath({
|
|
225
|
-
engine: 'postgresql',
|
|
226
|
-
version: pgFullVersion,
|
|
227
|
-
platform,
|
|
228
|
-
arch,
|
|
229
|
-
})
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const fullBackendVersion = this.getFullDocumentDBVersion(
|
|
233
|
-
backendVersion || DEFAULT_DOCUMENTDB_VERSION,
|
|
234
|
-
)
|
|
235
|
-
return this.getDocumentDBBinaryPath(fullBackendVersion, platform, arch)
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Get environment variables needed to run backend binaries.
|
|
240
|
-
* For v1: delegates to PostgreSQL's standard env (usually none needed)
|
|
241
|
-
* For v2: delegates to getDocumentDBSpawnEnv
|
|
242
|
-
*
|
|
243
|
-
* @param ferretdbVersion - FerretDB version
|
|
244
|
-
* @param backendVersion - Backend version
|
|
245
|
-
* @param platform - Operating system
|
|
246
|
-
* @param arch - Architecture
|
|
247
|
-
*/
|
|
248
|
-
getBackendSpawnEnv(
|
|
249
|
-
ferretdbVersion: string,
|
|
250
|
-
backendVersion: string,
|
|
251
|
-
platform: Platform,
|
|
252
|
-
arch: Arch,
|
|
253
|
-
): Record<string, string> | undefined {
|
|
254
|
-
if (isV1(ferretdbVersion)) {
|
|
255
|
-
// Plain PostgreSQL doesn't need special env vars on most platforms
|
|
256
|
-
// Linux may need LD_LIBRARY_PATH
|
|
257
|
-
if (platform !== Platform.Linux) {
|
|
258
|
-
return undefined
|
|
259
|
-
}
|
|
260
|
-
const pgPath = this.getBackendBinaryPath(
|
|
261
|
-
ferretdbVersion,
|
|
262
|
-
backendVersion,
|
|
263
|
-
platform,
|
|
264
|
-
arch,
|
|
265
|
-
)
|
|
266
|
-
const libPath = join(pgPath, 'lib')
|
|
267
|
-
const existingLdPath = process.env['LD_LIBRARY_PATH'] || ''
|
|
268
|
-
const newLdPath = existingLdPath
|
|
269
|
-
? `${libPath}:${existingLdPath}`
|
|
270
|
-
: libPath
|
|
271
|
-
return { LD_LIBRARY_PATH: newLdPath }
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
const fullBackendVersion = this.getFullDocumentDBVersion(
|
|
275
|
-
backendVersion || DEFAULT_DOCUMENTDB_VERSION,
|
|
276
|
-
)
|
|
277
|
-
return this.getDocumentDBSpawnEnv(fullBackendVersion, platform, arch)
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* List all installed FerretDB versions
|
|
282
|
-
*/
|
|
283
|
-
async listInstalled(): Promise<InstalledBinary[]> {
|
|
284
|
-
const binDir = paths.bin
|
|
285
|
-
if (!existsSync(binDir)) {
|
|
286
|
-
return []
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
const entries = await readdir(binDir, { withFileTypes: true })
|
|
290
|
-
const installed: InstalledBinary[] = []
|
|
291
|
-
const prefix = 'ferretdb-'
|
|
292
|
-
|
|
293
|
-
for (const entry of entries) {
|
|
294
|
-
if (!entry.isDirectory()) continue
|
|
295
|
-
if (!entry.name.startsWith(prefix)) continue
|
|
296
|
-
|
|
297
|
-
// Split from end to handle versions with dashes
|
|
298
|
-
// Format: ferretdb-{version}-{platform}-{arch}
|
|
299
|
-
const rest = entry.name.slice(prefix.length)
|
|
300
|
-
const parts = rest.split('-')
|
|
301
|
-
if (parts.length < 3) continue
|
|
302
|
-
|
|
303
|
-
const arch = parts.pop()!
|
|
304
|
-
const platform = parts.pop()!
|
|
305
|
-
const version = parts.join('-')
|
|
306
|
-
|
|
307
|
-
if (version && isValidPlatform(platform) && isValidArch(arch)) {
|
|
308
|
-
installed.push({
|
|
309
|
-
engine: Engine.FerretDB,
|
|
310
|
-
version,
|
|
311
|
-
platform,
|
|
312
|
-
arch,
|
|
313
|
-
})
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
return installed
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
* Ensure both FerretDB binaries are installed
|
|
322
|
-
*
|
|
323
|
-
* @param version - FerretDB version
|
|
324
|
-
* @param platform - Operating system
|
|
325
|
-
* @param arch - Architecture
|
|
326
|
-
* @param onProgress - Progress callback
|
|
327
|
-
* @param backendVersion - Backend version (postgresql-documentdb for v2, PostgreSQL major for v1)
|
|
328
|
-
* @returns Paths to both binary directories
|
|
329
|
-
*/
|
|
330
|
-
async ensureInstalled(
|
|
331
|
-
version: string,
|
|
332
|
-
platform: Platform,
|
|
333
|
-
arch: Arch,
|
|
334
|
-
onProgress?: ProgressCallback,
|
|
335
|
-
backendVersion?: string,
|
|
336
|
-
): Promise<FerretDBBinaryPaths> {
|
|
337
|
-
const fullVersion = this.getFullVersion(version)
|
|
338
|
-
const v1 = isV1(version)
|
|
339
|
-
const effectiveBackendVersion =
|
|
340
|
-
backendVersion ||
|
|
341
|
-
(v1 ? DEFAULT_V1_POSTGRESQL_VERSION : DEFAULT_DOCUMENTDB_VERSION)
|
|
342
|
-
|
|
343
|
-
// Check if already installed
|
|
344
|
-
if (
|
|
345
|
-
await this.isInstalled(version, platform, arch, effectiveBackendVersion)
|
|
346
|
-
) {
|
|
347
|
-
onProgress?.({
|
|
348
|
-
stage: 'cached',
|
|
349
|
-
message: 'Using cached FerretDB binaries',
|
|
350
|
-
})
|
|
351
|
-
return {
|
|
352
|
-
ferretdbPath: this.getFerretDBBinaryPath(fullVersion, platform, arch),
|
|
353
|
-
backendPath: this.getBackendBinaryPath(
|
|
354
|
-
fullVersion,
|
|
355
|
-
effectiveBackendVersion,
|
|
356
|
-
platform,
|
|
357
|
-
arch,
|
|
358
|
-
),
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
if (v1) {
|
|
363
|
-
return this.ensureInstalledV1(
|
|
364
|
-
version,
|
|
365
|
-
platform,
|
|
366
|
-
arch,
|
|
367
|
-
onProgress,
|
|
368
|
-
effectiveBackendVersion,
|
|
369
|
-
)
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
return this.ensureInstalledV2(
|
|
373
|
-
version,
|
|
374
|
-
platform,
|
|
375
|
-
arch,
|
|
376
|
-
onProgress,
|
|
377
|
-
effectiveBackendVersion,
|
|
378
|
-
)
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
/**
|
|
382
|
-
* Ensure v1 FerretDB binaries are installed (proxy + plain PostgreSQL)
|
|
383
|
-
*/
|
|
384
|
-
private async ensureInstalledV1(
|
|
385
|
-
version: string,
|
|
386
|
-
platform: Platform,
|
|
387
|
-
arch: Arch,
|
|
388
|
-
onProgress?: ProgressCallback,
|
|
389
|
-
backendVersion: string = DEFAULT_V1_POSTGRESQL_VERSION,
|
|
390
|
-
): Promise<FerretDBBinaryPaths> {
|
|
391
|
-
// Download FerretDB v1 proxy
|
|
392
|
-
const ferretdbPath = await this.downloadFerretDB(
|
|
393
|
-
version,
|
|
394
|
-
platform,
|
|
395
|
-
arch,
|
|
396
|
-
onProgress,
|
|
397
|
-
)
|
|
398
|
-
|
|
399
|
-
// Ensure plain PostgreSQL is installed via postgresqlBinaryManager
|
|
400
|
-
onProgress?.({
|
|
401
|
-
stage: 'downloading',
|
|
402
|
-
message: 'Ensuring PostgreSQL backend is available...',
|
|
403
|
-
})
|
|
404
|
-
const backendPath = await postgresqlBinaryManager.ensureInstalled(
|
|
405
|
-
backendVersion,
|
|
406
|
-
platform,
|
|
407
|
-
arch,
|
|
408
|
-
onProgress,
|
|
409
|
-
)
|
|
410
|
-
|
|
411
|
-
return { ferretdbPath, backendPath }
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
/**
|
|
415
|
-
* Ensure v2 FerretDB binaries are installed (proxy + postgresql-documentdb)
|
|
416
|
-
*/
|
|
417
|
-
private async ensureInstalledV2(
|
|
418
|
-
version: string,
|
|
419
|
-
platform: Platform,
|
|
420
|
-
arch: Arch,
|
|
421
|
-
onProgress?: ProgressCallback,
|
|
422
|
-
backendVersion: string = DEFAULT_DOCUMENTDB_VERSION,
|
|
423
|
-
): Promise<FerretDBBinaryPaths> {
|
|
424
|
-
const fullVersion = this.getFullVersion(version)
|
|
425
|
-
|
|
426
|
-
// Check if FerretDB is already installed (DocumentDB might be missing)
|
|
427
|
-
const ext = platform === Platform.Win32 ? '.exe' : ''
|
|
428
|
-
const ferretdbBinaryPath = this.getFerretDBBinaryPath(
|
|
429
|
-
fullVersion,
|
|
430
|
-
platform,
|
|
431
|
-
arch,
|
|
432
|
-
)
|
|
433
|
-
const ferretdbBinary = join(ferretdbBinaryPath, 'bin', `ferretdb${ext}`)
|
|
434
|
-
const ferretdbAlreadyInstalled = existsSync(ferretdbBinary)
|
|
435
|
-
|
|
436
|
-
// Download both binaries - ensure atomicity by cleaning up FerretDB if DocumentDB fails
|
|
437
|
-
// (only if FerretDB was newly downloaded in this call)
|
|
438
|
-
const ferretdbPath = await this.downloadFerretDB(
|
|
439
|
-
version,
|
|
440
|
-
platform,
|
|
441
|
-
arch,
|
|
442
|
-
onProgress,
|
|
443
|
-
)
|
|
444
|
-
|
|
445
|
-
let backendPath: string
|
|
446
|
-
try {
|
|
447
|
-
backendPath = await this.downloadDocumentDB(
|
|
448
|
-
backendVersion,
|
|
449
|
-
platform,
|
|
450
|
-
arch,
|
|
451
|
-
onProgress,
|
|
452
|
-
)
|
|
453
|
-
} catch (error) {
|
|
454
|
-
// Only clean up FerretDB if it was newly downloaded (not pre-existing)
|
|
455
|
-
if (!ferretdbAlreadyInstalled) {
|
|
456
|
-
onProgress?.({
|
|
457
|
-
stage: 'error',
|
|
458
|
-
message:
|
|
459
|
-
'postgresql-documentdb download failed, cleaning up FerretDB...',
|
|
460
|
-
})
|
|
461
|
-
await rm(ferretdbPath, { recursive: true, force: true }).catch(() => {})
|
|
462
|
-
}
|
|
463
|
-
throw error
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
return { ferretdbPath, backendPath }
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
/**
|
|
470
|
-
* Download FerretDB proxy binary
|
|
471
|
-
*/
|
|
472
|
-
private async downloadFerretDB(
|
|
473
|
-
version: string,
|
|
474
|
-
platform: Platform,
|
|
475
|
-
arch: Arch,
|
|
476
|
-
onProgress?: ProgressCallback,
|
|
477
|
-
): Promise<string> {
|
|
478
|
-
const fullVersion = this.getFullVersion(version)
|
|
479
|
-
const binPath = this.getFerretDBBinaryPath(fullVersion, platform, arch)
|
|
480
|
-
|
|
481
|
-
// Check if FerretDB is already installed
|
|
482
|
-
const ext = platform === Platform.Win32 ? '.exe' : ''
|
|
483
|
-
const ferretdbBinary = join(binPath, 'bin', `ferretdb${ext}`)
|
|
484
|
-
if (existsSync(ferretdbBinary)) {
|
|
485
|
-
onProgress?.({
|
|
486
|
-
stage: 'cached',
|
|
487
|
-
message: 'FerretDB proxy already installed',
|
|
488
|
-
})
|
|
489
|
-
return binPath
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
const url = getFerretDBBinaryUrl(version, platform, arch)
|
|
493
|
-
const tempDir = join(
|
|
494
|
-
paths.bin,
|
|
495
|
-
`temp-ferretdb-${fullVersion}-${platform}-${arch}`,
|
|
496
|
-
)
|
|
497
|
-
const archiveExt = platform === Platform.Win32 ? 'zip' : 'tar.gz'
|
|
498
|
-
const archiveFile = join(tempDir, `ferretdb.${archiveExt}`)
|
|
499
|
-
|
|
500
|
-
// Clean up any partial installation
|
|
501
|
-
if (existsSync(binPath)) {
|
|
502
|
-
await rm(binPath, { recursive: true, force: true })
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
// Ensure directories exist
|
|
506
|
-
await mkdir(paths.bin, { recursive: true })
|
|
507
|
-
await mkdir(tempDir, { recursive: true })
|
|
508
|
-
await mkdir(binPath, { recursive: true })
|
|
509
|
-
|
|
510
|
-
let success = false
|
|
511
|
-
try {
|
|
512
|
-
onProgress?.({
|
|
513
|
-
stage: 'downloading',
|
|
514
|
-
message: 'Downloading FerretDB proxy...',
|
|
515
|
-
})
|
|
516
|
-
|
|
517
|
-
await this.downloadArchive(url, archiveFile, 'FerretDB')
|
|
518
|
-
|
|
519
|
-
if (platform === Platform.Win32) {
|
|
520
|
-
await this.extractWindowsBinaries(
|
|
521
|
-
archiveFile,
|
|
522
|
-
binPath,
|
|
523
|
-
tempDir,
|
|
524
|
-
onProgress,
|
|
525
|
-
)
|
|
526
|
-
} else {
|
|
527
|
-
await this.extractUnixBinaries(
|
|
528
|
-
archiveFile,
|
|
529
|
-
binPath,
|
|
530
|
-
tempDir,
|
|
531
|
-
onProgress,
|
|
532
|
-
)
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
// Make binaries executable (Unix only)
|
|
536
|
-
if (platform !== Platform.Win32) {
|
|
537
|
-
const binDir = join(binPath, 'bin')
|
|
538
|
-
if (existsSync(binDir)) {
|
|
539
|
-
const binaries = await readdir(binDir)
|
|
540
|
-
for (const binary of binaries) {
|
|
541
|
-
await chmod(join(binDir, binary), 0o755)
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
// On macOS, re-sign binaries to fix code signature issues
|
|
547
|
-
if (platform === Platform.Darwin) {
|
|
548
|
-
onProgress?.({
|
|
549
|
-
stage: 'signing',
|
|
550
|
-
message: 'Re-signing FerretDB binaries for macOS...',
|
|
551
|
-
})
|
|
552
|
-
await this.resignMacOSBinaries(binPath)
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
// Verify the installation
|
|
556
|
-
onProgress?.({ stage: 'verifying', message: 'Verifying FerretDB...' })
|
|
557
|
-
await this.verifyFerretDB(fullVersion, platform, arch)
|
|
558
|
-
|
|
559
|
-
success = true
|
|
560
|
-
return binPath
|
|
561
|
-
} finally {
|
|
562
|
-
// Clean up temp directory
|
|
563
|
-
await rm(tempDir, { recursive: true, force: true })
|
|
564
|
-
// Clean up binPath on failure
|
|
565
|
-
if (!success) {
|
|
566
|
-
await rm(binPath, { recursive: true, force: true })
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
/**
|
|
572
|
-
* Download postgresql-documentdb backend binary
|
|
573
|
-
*/
|
|
574
|
-
private async downloadDocumentDB(
|
|
575
|
-
version: string,
|
|
576
|
-
platform: Platform,
|
|
577
|
-
arch: Arch,
|
|
578
|
-
onProgress?: ProgressCallback,
|
|
579
|
-
): Promise<string> {
|
|
580
|
-
const fullVersion = this.getFullDocumentDBVersion(version)
|
|
581
|
-
const binPath = this.getDocumentDBBinaryPath(fullVersion, platform, arch)
|
|
582
|
-
|
|
583
|
-
// Check if postgresql-documentdb is already installed
|
|
584
|
-
const ext = platform === Platform.Win32 ? '.exe' : ''
|
|
585
|
-
const pgCtl = join(binPath, 'bin', `pg_ctl${ext}`)
|
|
586
|
-
if (existsSync(pgCtl)) {
|
|
587
|
-
onProgress?.({
|
|
588
|
-
stage: 'cached',
|
|
589
|
-
message: 'postgresql-documentdb already installed',
|
|
590
|
-
})
|
|
591
|
-
return binPath
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
const url = getDocumentDBBinaryUrl(version, platform, arch)
|
|
595
|
-
const tempDir = join(
|
|
596
|
-
paths.bin,
|
|
597
|
-
`temp-postgresql-documentdb-${fullVersion}-${platform}-${arch}`,
|
|
598
|
-
)
|
|
599
|
-
const archiveFile = join(tempDir, 'postgresql-documentdb.tar.gz')
|
|
600
|
-
|
|
601
|
-
// Clean up any partial installation
|
|
602
|
-
if (existsSync(binPath)) {
|
|
603
|
-
await rm(binPath, { recursive: true, force: true })
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
// Ensure directories exist
|
|
607
|
-
await mkdir(paths.bin, { recursive: true })
|
|
608
|
-
await mkdir(tempDir, { recursive: true })
|
|
609
|
-
await mkdir(binPath, { recursive: true })
|
|
610
|
-
|
|
611
|
-
let success = false
|
|
612
|
-
try {
|
|
613
|
-
onProgress?.({
|
|
614
|
-
stage: 'downloading',
|
|
615
|
-
message: 'Downloading postgresql-documentdb backend...',
|
|
616
|
-
})
|
|
617
|
-
|
|
618
|
-
await this.downloadArchive(url, archiveFile, 'postgresql-documentdb')
|
|
619
|
-
|
|
620
|
-
await this.extractUnixBinaries(archiveFile, binPath, tempDir, onProgress)
|
|
621
|
-
|
|
622
|
-
// Make binaries executable
|
|
623
|
-
const binaryDir = join(binPath, 'bin')
|
|
624
|
-
if (existsSync(binaryDir)) {
|
|
625
|
-
const binaries = await readdir(binaryDir)
|
|
626
|
-
for (const binary of binaries) {
|
|
627
|
-
await chmod(join(binaryDir, binary), 0o755)
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
// On macOS, re-sign binaries and libraries to fix code signature issues
|
|
632
|
-
// (signatures become invalid after download due to quarantine/Gatekeeper)
|
|
633
|
-
if (platform === Platform.Darwin) {
|
|
634
|
-
onProgress?.({
|
|
635
|
-
stage: 'signing',
|
|
636
|
-
message: 'Re-signing binaries for macOS...',
|
|
637
|
-
})
|
|
638
|
-
await this.resignMacOSBinaries(binPath)
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
// Verify the installation
|
|
642
|
-
onProgress?.({
|
|
643
|
-
stage: 'verifying',
|
|
644
|
-
message: 'Verifying postgresql-documentdb...',
|
|
645
|
-
})
|
|
646
|
-
await this.verifyDocumentDB(fullVersion, platform, arch)
|
|
647
|
-
|
|
648
|
-
success = true
|
|
649
|
-
return binPath
|
|
650
|
-
} finally {
|
|
651
|
-
// Clean up temp directory
|
|
652
|
-
await rm(tempDir, { recursive: true, force: true })
|
|
653
|
-
// Clean up binPath on failure
|
|
654
|
-
if (!success) {
|
|
655
|
-
await rm(binPath, { recursive: true, force: true })
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
/**
|
|
661
|
-
* Download an archive file
|
|
662
|
-
*/
|
|
663
|
-
private async downloadArchive(
|
|
664
|
-
url: string,
|
|
665
|
-
archiveFile: string,
|
|
666
|
-
displayName: string,
|
|
667
|
-
): Promise<void> {
|
|
668
|
-
const controller = new AbortController()
|
|
669
|
-
const timeoutId = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS)
|
|
670
|
-
|
|
671
|
-
try {
|
|
672
|
-
const response = await fetchWithRegistryFallback(url, {
|
|
673
|
-
signal: controller.signal,
|
|
674
|
-
})
|
|
675
|
-
|
|
676
|
-
if (!response.ok) {
|
|
677
|
-
if (response.status === 404) {
|
|
678
|
-
throw new Error(
|
|
679
|
-
`${displayName} binaries not found (404). ` +
|
|
680
|
-
'This version may have been removed from hostdb. ' +
|
|
681
|
-
'Try a different version or check https://registry.layerbase.host',
|
|
682
|
-
)
|
|
683
|
-
}
|
|
684
|
-
throw new Error(
|
|
685
|
-
`Failed to download ${displayName} binaries: ${response.status} ${response.statusText}`,
|
|
686
|
-
)
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
if (!response.body) {
|
|
690
|
-
throw new Error(
|
|
691
|
-
`Download failed: response has no body (status ${response.status})`,
|
|
692
|
-
)
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
const fileStream = createWriteStream(archiveFile)
|
|
696
|
-
try {
|
|
697
|
-
const nodeStream = Readable.fromWeb(response.body)
|
|
698
|
-
await pipeline(nodeStream, fileStream)
|
|
699
|
-
} catch (pipelineError) {
|
|
700
|
-
fileStream.destroy()
|
|
701
|
-
throw pipelineError
|
|
702
|
-
}
|
|
703
|
-
} catch (error) {
|
|
704
|
-
const err = error as Error
|
|
705
|
-
if (err.name === 'AbortError') {
|
|
706
|
-
throw new Error(
|
|
707
|
-
`Download timed out after ${DOWNLOAD_TIMEOUT_MS / 1000 / 60} minutes. ` +
|
|
708
|
-
'Check your network connection and try again.',
|
|
709
|
-
)
|
|
710
|
-
}
|
|
711
|
-
throw error
|
|
712
|
-
} finally {
|
|
713
|
-
clearTimeout(timeoutId)
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
/**
|
|
718
|
-
* Extract Unix binaries from tar.gz file
|
|
719
|
-
*/
|
|
720
|
-
private async extractUnixBinaries(
|
|
721
|
-
tarFile: string,
|
|
722
|
-
binPath: string,
|
|
723
|
-
tempDir: string,
|
|
724
|
-
onProgress?: ProgressCallback,
|
|
725
|
-
): Promise<void> {
|
|
726
|
-
onProgress?.({
|
|
727
|
-
stage: 'extracting',
|
|
728
|
-
message: 'Extracting binaries...',
|
|
729
|
-
})
|
|
730
|
-
|
|
731
|
-
const extractDir = join(tempDir, 'extract')
|
|
732
|
-
await mkdir(extractDir, { recursive: true })
|
|
733
|
-
|
|
734
|
-
try {
|
|
735
|
-
await spawnAsync('tar', ['-xzf', tarFile, '-C', extractDir])
|
|
736
|
-
} catch (error) {
|
|
737
|
-
const err = error as Error & { code?: string | number }
|
|
738
|
-
|
|
739
|
-
// Check if extraction actually succeeded despite the error
|
|
740
|
-
const entries = await readdir(extractDir)
|
|
741
|
-
if (entries.length === 0) {
|
|
742
|
-
throw new Error(
|
|
743
|
-
`Extraction failed: ${err.message}${err.code ? ` (code: ${err.code})` : ''}`,
|
|
744
|
-
)
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
logDebug('FerretDB extraction recovered from tar error', {
|
|
748
|
-
tarFile,
|
|
749
|
-
entriesExtracted: entries.length,
|
|
750
|
-
errorMessage: err.message,
|
|
751
|
-
errorCode: err.code,
|
|
752
|
-
})
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
await this.moveExtractedEntries(extractDir, binPath)
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
/**
|
|
759
|
-
* Extract Windows binaries from ZIP file
|
|
760
|
-
*
|
|
761
|
-
* FerretDB v1 supports Windows. v2 does not (postgresql-documentdb startup issues).
|
|
762
|
-
*/
|
|
763
|
-
private async extractWindowsBinaries(
|
|
764
|
-
zipFile: string,
|
|
765
|
-
binPath: string,
|
|
766
|
-
tempDir: string,
|
|
767
|
-
onProgress?: ProgressCallback,
|
|
768
|
-
): Promise<void> {
|
|
769
|
-
onProgress?.({
|
|
770
|
-
stage: 'extracting',
|
|
771
|
-
message: 'Extracting binaries...',
|
|
772
|
-
})
|
|
773
|
-
|
|
774
|
-
const extractDir = join(tempDir, 'extract')
|
|
775
|
-
await mkdir(extractDir, { recursive: true })
|
|
776
|
-
|
|
777
|
-
await extractWindowsArchive(zipFile, extractDir)
|
|
778
|
-
await this.moveExtractedEntries(extractDir, binPath)
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
/**
|
|
782
|
-
* Move extracted entries from extractDir to binPath
|
|
783
|
-
*/
|
|
784
|
-
private async moveExtractedEntries(
|
|
785
|
-
extractDir: string,
|
|
786
|
-
binPath: string,
|
|
787
|
-
): Promise<void> {
|
|
788
|
-
const entries = await readdir(extractDir, { withFileTypes: true })
|
|
789
|
-
|
|
790
|
-
// Look for engine directory (ferretdb-* or postgresql-documentdb-*)
|
|
791
|
-
const engineDir = entries.find(
|
|
792
|
-
(e) =>
|
|
793
|
-
e.isDirectory() &&
|
|
794
|
-
(e.name === 'ferretdb' ||
|
|
795
|
-
e.name.startsWith('ferretdb-') ||
|
|
796
|
-
e.name === 'postgresql-documentdb' ||
|
|
797
|
-
e.name.startsWith('postgresql-documentdb-')),
|
|
798
|
-
)
|
|
799
|
-
|
|
800
|
-
const sourceDir = engineDir ? join(extractDir, engineDir.name) : extractDir
|
|
801
|
-
const sourceEntries = engineDir
|
|
802
|
-
? await readdir(sourceDir, { withFileTypes: true })
|
|
803
|
-
: entries
|
|
804
|
-
|
|
805
|
-
for (const entry of sourceEntries) {
|
|
806
|
-
const sourcePath = join(sourceDir, entry.name)
|
|
807
|
-
const destPath = join(binPath, entry.name)
|
|
808
|
-
try {
|
|
809
|
-
await rename(sourcePath, destPath)
|
|
810
|
-
} catch (error) {
|
|
811
|
-
if (isRenameFallbackError(error)) {
|
|
812
|
-
await cp(sourcePath, destPath, { recursive: true })
|
|
813
|
-
await rm(sourcePath, { recursive: true, force: true })
|
|
814
|
-
} else {
|
|
815
|
-
throw error
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
|
|
821
|
-
/**
|
|
822
|
-
* Verify FerretDB binary installation
|
|
823
|
-
*/
|
|
824
|
-
private async verifyFerretDB(
|
|
825
|
-
version: string,
|
|
826
|
-
platform: Platform,
|
|
827
|
-
arch: Arch,
|
|
828
|
-
): Promise<void> {
|
|
829
|
-
const binPath = this.getFerretDBBinaryPath(version, platform, arch)
|
|
830
|
-
const ext = platform === Platform.Win32 ? '.exe' : ''
|
|
831
|
-
const ferretdbBinary = join(binPath, 'bin', `ferretdb${ext}`)
|
|
832
|
-
|
|
833
|
-
if (!existsSync(ferretdbBinary)) {
|
|
834
|
-
throw new Error(`FerretDB binary not found at ${binPath}/bin/`)
|
|
835
|
-
}
|
|
836
|
-
|
|
837
|
-
// FerretDB v1 hostdb builds panic on --version due to missing version.txt
|
|
838
|
-
// at build time. For v1, just verify the binary exists (checked above).
|
|
839
|
-
if (isV1(version)) {
|
|
840
|
-
return
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
try {
|
|
844
|
-
const { stdout } = await spawnAsync(ferretdbBinary, ['--version'])
|
|
845
|
-
const match = stdout.match(
|
|
846
|
-
/(?:ferretdb\s+)?(?:version\s+)?v?(\d+\.\d+\.\d+)/,
|
|
847
|
-
)
|
|
848
|
-
if (!match) {
|
|
849
|
-
throw new Error(
|
|
850
|
-
`Could not parse FerretDB version from: ${stdout.trim()}`,
|
|
851
|
-
)
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
const reportedVersion = match[1]
|
|
855
|
-
const expectedMajor = version.split('.')[0]
|
|
856
|
-
const reportedMajor = reportedVersion.split('.')[0]
|
|
857
|
-
|
|
858
|
-
if (expectedMajor !== reportedMajor) {
|
|
859
|
-
throw new Error(
|
|
860
|
-
`Version mismatch: expected ${version}, got ${reportedVersion}`,
|
|
861
|
-
)
|
|
862
|
-
}
|
|
863
|
-
} catch (error) {
|
|
864
|
-
const err = error as Error
|
|
865
|
-
throw new Error(`Failed to verify FerretDB binary: ${err.message}`)
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
/**
|
|
870
|
-
* Verify postgresql-documentdb binary installation
|
|
871
|
-
* Tests both pg_ctl and initdb since initdb is used during container creation
|
|
872
|
-
*/
|
|
873
|
-
private async verifyDocumentDB(
|
|
874
|
-
version: string,
|
|
875
|
-
platform: Platform,
|
|
876
|
-
arch: Arch,
|
|
877
|
-
): Promise<void> {
|
|
878
|
-
const binPath = this.getDocumentDBBinaryPath(version, platform, arch)
|
|
879
|
-
const ext = platform === Platform.Win32 ? '.exe' : ''
|
|
880
|
-
const pgCtl = join(binPath, 'bin', `pg_ctl${ext}`)
|
|
881
|
-
const initdb = join(binPath, 'bin', `initdb${ext}`)
|
|
882
|
-
|
|
883
|
-
if (!existsSync(pgCtl)) {
|
|
884
|
-
throw new Error(
|
|
885
|
-
`postgresql-documentdb binary not found at ${binPath}/bin/`,
|
|
886
|
-
)
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
if (!existsSync(initdb)) {
|
|
890
|
-
throw new Error(
|
|
891
|
-
`initdb not found at ${binPath}/bin/ - required for container initialization`,
|
|
892
|
-
)
|
|
893
|
-
}
|
|
894
|
-
|
|
895
|
-
// Get spawn env for Linux (LD_LIBRARY_PATH)
|
|
896
|
-
const spawnEnv = this.getDocumentDBSpawnEnv(version, platform, arch)
|
|
897
|
-
|
|
898
|
-
// Verify pg_ctl works
|
|
899
|
-
try {
|
|
900
|
-
const { stdout } = await spawnAsync(pgCtl, ['--version'], {
|
|
901
|
-
env: spawnEnv,
|
|
902
|
-
})
|
|
903
|
-
// Expected output: "pg_ctl (PostgreSQL) 17.x.x"
|
|
904
|
-
const match = stdout.match(/PostgreSQL[)\s]+(\d+)/)
|
|
905
|
-
if (!match) {
|
|
906
|
-
throw new Error(
|
|
907
|
-
`Could not parse PostgreSQL version from: ${stdout.trim()}`,
|
|
908
|
-
)
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
// version is like "17-0.107.0", extract PostgreSQL major version
|
|
912
|
-
const expectedPgMajor = version.split('-')[0]
|
|
913
|
-
const reportedPgMajor = match[1]
|
|
914
|
-
|
|
915
|
-
if (expectedPgMajor !== reportedPgMajor) {
|
|
916
|
-
throw new Error(
|
|
917
|
-
`PostgreSQL version mismatch: expected ${expectedPgMajor}, got ${reportedPgMajor}`,
|
|
918
|
-
)
|
|
919
|
-
}
|
|
920
|
-
} catch (error) {
|
|
921
|
-
const err = error as Error & { code?: string | number | null }
|
|
922
|
-
|
|
923
|
-
// Check for library loading issues (common on macOS/Linux with hostdb binaries)
|
|
924
|
-
if (
|
|
925
|
-
!err.code ||
|
|
926
|
-
err.code === 'ENOENT' ||
|
|
927
|
-
err.message.includes('dyld') ||
|
|
928
|
-
err.message.includes('GLIBC')
|
|
929
|
-
) {
|
|
930
|
-
throw new Error(
|
|
931
|
-
`postgresql-documentdb pg_ctl failed to execute. This is likely due to missing or incompatible libraries.\n` +
|
|
932
|
-
`The hostdb binaries may need to be rebuilt with proper rpath settings.\n` +
|
|
933
|
-
`See: https://github.com/robertjbass/hostdb/issues\n` +
|
|
934
|
-
`Original error: ${err.message || 'Process killed (library loading failed)'}`,
|
|
935
|
-
)
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
throw new Error(
|
|
939
|
-
`Failed to verify postgresql-documentdb pg_ctl: ${err.message}`,
|
|
940
|
-
)
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
// Verify initdb works (critical for container creation)
|
|
944
|
-
try {
|
|
945
|
-
const { stdout } = await spawnAsync(initdb, ['--version'], {
|
|
946
|
-
env: spawnEnv,
|
|
947
|
-
})
|
|
948
|
-
// Expected output: "initdb (PostgreSQL) 17.x.x"
|
|
949
|
-
const match = stdout.match(/PostgreSQL[)\s]+(\d+)/)
|
|
950
|
-
if (!match) {
|
|
951
|
-
throw new Error(`Could not parse initdb version from: ${stdout.trim()}`)
|
|
952
|
-
}
|
|
953
|
-
logDebug(`initdb verified: ${stdout.trim()}`)
|
|
954
|
-
} catch (error) {
|
|
955
|
-
const err = error as Error & { code?: string | number | null }
|
|
956
|
-
|
|
957
|
-
// Check for library loading issues
|
|
958
|
-
if (
|
|
959
|
-
!err.code ||
|
|
960
|
-
err.code === 'ENOENT' ||
|
|
961
|
-
err.message.includes('dyld') ||
|
|
962
|
-
err.message.includes('GLIBC')
|
|
963
|
-
) {
|
|
964
|
-
throw new Error(
|
|
965
|
-
`postgresql-documentdb initdb failed to execute. This is likely due to missing or incompatible libraries.\n` +
|
|
966
|
-
`initdb is required for FerretDB container initialization.\n` +
|
|
967
|
-
`The hostdb binaries may need to be rebuilt with proper rpath settings.\n` +
|
|
968
|
-
`See: https://github.com/robertjbass/hostdb/issues\n` +
|
|
969
|
-
`Original error: ${err.message || 'Process killed (library loading failed)'}`,
|
|
970
|
-
)
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
throw new Error(
|
|
974
|
-
`Failed to verify postgresql-documentdb initdb: ${err.message}`,
|
|
975
|
-
)
|
|
976
|
-
}
|
|
977
|
-
}
|
|
978
|
-
|
|
979
|
-
/**
|
|
980
|
-
* Delete installed binaries for a specific version
|
|
981
|
-
*
|
|
982
|
-
* For v1: Only deletes the FerretDB proxy. Plain PostgreSQL binaries are shared
|
|
983
|
-
* with standalone PostgreSQL containers and should NOT be deleted.
|
|
984
|
-
*
|
|
985
|
-
* For v2: Deletes both FerretDB proxy and postgresql-documentdb backend.
|
|
986
|
-
*/
|
|
987
|
-
async delete(
|
|
988
|
-
version: string,
|
|
989
|
-
platform: Platform,
|
|
990
|
-
arch: Arch,
|
|
991
|
-
backendVersion: string = DEFAULT_DOCUMENTDB_VERSION,
|
|
992
|
-
): Promise<void> {
|
|
993
|
-
const fullVersion = this.getFullVersion(version)
|
|
994
|
-
|
|
995
|
-
const ferretdbPath = this.getFerretDBBinaryPath(fullVersion, platform, arch)
|
|
996
|
-
if (existsSync(ferretdbPath)) {
|
|
997
|
-
await rm(ferretdbPath, { recursive: true, force: true })
|
|
998
|
-
}
|
|
999
|
-
|
|
1000
|
-
// v1: Don't delete shared PostgreSQL binaries (cascadeDelete: false)
|
|
1001
|
-
if (isV1(version)) {
|
|
1002
|
-
logDebug(
|
|
1003
|
-
'Skipping PostgreSQL backend deletion for FerretDB v1 (shared with standalone PG containers)',
|
|
1004
|
-
)
|
|
1005
|
-
return
|
|
1006
|
-
}
|
|
1007
|
-
|
|
1008
|
-
// v2: Delete postgresql-documentdb backend
|
|
1009
|
-
const fullBackendVersion = this.getFullDocumentDBVersion(backendVersion)
|
|
1010
|
-
const documentdbPath = this.getDocumentDBBinaryPath(
|
|
1011
|
-
fullBackendVersion,
|
|
1012
|
-
platform,
|
|
1013
|
-
arch,
|
|
1014
|
-
)
|
|
1015
|
-
if (existsSync(documentdbPath)) {
|
|
1016
|
-
await rm(documentdbPath, { recursive: true, force: true })
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
|
|
1020
|
-
/**
|
|
1021
|
-
* Re-sign macOS binaries with ad-hoc signature
|
|
1022
|
-
*
|
|
1023
|
-
* Downloaded binaries may have invalid signatures due to Gatekeeper quarantine.
|
|
1024
|
-
* Re-signing with ad-hoc signature (-s -) allows them to run without issues.
|
|
1025
|
-
*/
|
|
1026
|
-
private async resignMacOSBinaries(binPath: string): Promise<void> {
|
|
1027
|
-
// Sign all dylibs first (binaries depend on them)
|
|
1028
|
-
const libDir = join(binPath, 'lib')
|
|
1029
|
-
if (existsSync(libDir)) {
|
|
1030
|
-
const libs = await readdir(libDir)
|
|
1031
|
-
for (const lib of libs) {
|
|
1032
|
-
if (lib.endsWith('.dylib')) {
|
|
1033
|
-
const libPath = join(libDir, lib)
|
|
1034
|
-
try {
|
|
1035
|
-
await spawnAsync('codesign', [
|
|
1036
|
-
'--force',
|
|
1037
|
-
'--deep',
|
|
1038
|
-
'-s',
|
|
1039
|
-
'-',
|
|
1040
|
-
libPath,
|
|
1041
|
-
])
|
|
1042
|
-
} catch {
|
|
1043
|
-
// Ignore signing errors for individual libs
|
|
1044
|
-
logDebug(`Failed to sign ${lib}, continuing...`)
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
|
|
1049
|
-
// Also sign libs in postgresql/ subdirectory if it exists
|
|
1050
|
-
const pgLibDir = join(libDir, 'postgresql')
|
|
1051
|
-
if (existsSync(pgLibDir)) {
|
|
1052
|
-
const pgLibs = await readdir(pgLibDir)
|
|
1053
|
-
for (const lib of pgLibs) {
|
|
1054
|
-
if (lib.endsWith('.dylib')) {
|
|
1055
|
-
const libPath = join(pgLibDir, lib)
|
|
1056
|
-
try {
|
|
1057
|
-
await spawnAsync('codesign', [
|
|
1058
|
-
'--force',
|
|
1059
|
-
'--deep',
|
|
1060
|
-
'-s',
|
|
1061
|
-
'-',
|
|
1062
|
-
libPath,
|
|
1063
|
-
])
|
|
1064
|
-
} catch {
|
|
1065
|
-
logDebug(`Failed to sign ${lib}, continuing...`)
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
}
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
// Sign all binaries
|
|
1073
|
-
const binDir = join(binPath, 'bin')
|
|
1074
|
-
if (existsSync(binDir)) {
|
|
1075
|
-
const binaries = await readdir(binDir)
|
|
1076
|
-
for (const binary of binaries) {
|
|
1077
|
-
const binaryPath = join(binDir, binary)
|
|
1078
|
-
try {
|
|
1079
|
-
await spawnAsync('codesign', [
|
|
1080
|
-
'--force',
|
|
1081
|
-
'--deep',
|
|
1082
|
-
'-s',
|
|
1083
|
-
'-',
|
|
1084
|
-
binaryPath,
|
|
1085
|
-
])
|
|
1086
|
-
} catch {
|
|
1087
|
-
// Ignore signing errors for individual binaries
|
|
1088
|
-
logDebug(`Failed to sign ${binary}, continuing...`)
|
|
1089
|
-
}
|
|
1090
|
-
}
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
export const ferretdbBinaryManager = new FerretDBCompositeBinaryManager()
|