utils/native_installer/native_installer library

Native Installer Implementation

Faithful port of neomage/src/utils/nativeInstaller/*.ts Covers: installer.ts, download.ts, pidLock.ts, packageManagers.ts

Provides:

  • Directory structure management with symlinks
  • Version installation and activation
  • Multi-process safety with PID-based and mtime-based locking
  • Binary download with checksum verification, stall detection, retry
  • Package manager detection (homebrew, winget, pacman, deb, rpm, apk, mise, asdf)

Classes

LockInfo
Diagnostic lock information.
NativeInstallerController
Manages the native installer lifecycle using Sint state management.
OsReleaseInfo
Parsed /etc/os-release fields.
SetupMessage
A message generated during the setup/installation process.
VersionLockContent
Content stored in a version lock file.

Enums

PackageManager
Supported package manager types.
SetupMessageType
Types of setup messages displayed during installation.

Constants

artifactoryRegistryUrl → const String
Artifactory npm registry URL for internal binary downloads.
defaultStallTimeoutMs → const int
Stall timeout: abort if no bytes received for this duration.
fallbackStaleMs → const int
Fallback stale timeout (2 hours) for PID-based locks when PID check is inconclusive.
gcsBucketUrl → const String
GCS bucket URL for external binary downloads.
lockStaleMs → const int
7 days in milliseconds — mtime-based lock stale timeout. Long enough to survive laptop sleep, short enough for eventual cleanup.
maxDownloadRetries → const int
Maximum download retries on stall timeout.
versionRetentionCount → const int
Number of old versions to retain before cleanup.

Functions

acquireProcessLifetimeLock(String versionPath, String lockFilePath) → Future<bool>
Acquire a lock and hold it for the lifetime of the process.
cleanupStaleLocks(String locksDir) → int
Clean up stale locks (locks where the process is no longer running). Returns the number of locks cleaned up. Handles both PID-based locks and legacy directory locks.
detectApk() → Future<bool>
Detects if installed via Alpine APK by querying apk.
detectAsdf() → bool
Detects if the currently running instance was installed via asdf. asdf installs to: ~/.asdf/installs/<tool>/<version>/
detectDeb() → Future<bool>
Detects if installed via a .deb package by querying dpkg.
detectHomebrew() → bool
Detects if the currently running instance was installed via Homebrew. Checks for Caskroom path specifically to distinguish from npm-global via Homebrew's npm.
detectMise() → bool
Detects if the currently running instance was installed via mise. mise installs to: ~/.local/share/mise/installs/<tool>/<version>/
detectPacman() → Future<bool>
Detects if installed via pacman by querying pacman's database. Gates on Arch distro family before invoking pacman.
detectRpm() → Future<bool>
Detects if installed via an RPM package by querying rpm.
detectWinget() → bool
Detects if the currently running instance was installed via winget. Winget installs to %LOCALAPPDATA%\Microsoft\WinGet\Packages or C:\Program Files\WinGet\Packages.
downloadAndVerifyBinary({required String binaryUrl, required String expectedChecksum, required String binaryPath, String? authUsername, String? authPassword}) → Future<void>
Download and verify a binary with stall detection and retry logic.
downloadVersion(String version, String stagingPath) → Future<String>
Download a version, routing to appropriate source. Returns the download type ('npm' or 'binary').
downloadVersionFromBinaryRepo({required String version, required String stagingPath, required String baseUrl, String? authUsername, String? authPassword}) → Future<void>
Download a version from a binary repository.
getAllLockInfo(String locksDir) → List<LockInfo>
Get information about all version locks for diagnostics.
getBinaryName(String platform) → String
Get the binary name for the platform.
getLatestVersion(String channelOrVersion) → Future<String>
Get the latest version, either from direct version string or channel lookup.
getLatestVersionFromBinaryRepo({String channel = 'latest', required String baseUrl, String? authUsername, String? authPassword}) → Future<String>
Get the latest version from a binary repo channel endpoint.
getOsRelease() → Future<OsReleaseInfo?>
Parses /etc/os-release to extract the distro ID and ID_LIKE fields. ID_LIKE identifies the distro family (e.g. Ubuntu has ID_LIKE=debian). Returns null if the file is unreadable.
getPackageManager() → Future<PackageManager>
Detect which package manager installed the application. Returns PackageManager.unknown if none detected.
getPlatform() → String
Get the platform string for binary downloads (e.g., "darwin-arm64").
getStallTimeoutMs() → int
Get the stall timeout in milliseconds, checking env override first.
isDistroFamily(OsReleaseInfo osRelease, List<String> families) → bool
Check if the OS release matches any of the given distro families.
isLockActive(String lockFilePath) → bool
Check if a lock file represents an active lock (process still running).
isPidBasedLockingEnabled() → bool
Whether PID-based locking is enabled. Controlled by environment variable or feature gate.
isProcessRunning(int pid) → bool
Check if a process with the given PID is currently running. Uses signal 0 which checks permission without sending a signal.
readLockContent(String lockFilePath) → VersionLockContent?
Read and parse a lock file's content.
tryAcquireLock(String versionPath, String lockFilePath) → Future<void Function()?>
Try to acquire a lock on a version file. Returns a release function if successful, null if already held.
withLock(String versionPath, String lockFilePath, Future<void> callback()) → Future<bool>
Execute a callback while holding a lock. Returns true if the callback executed, false if lock couldn't be acquired.
writeLockFile(String lockFilePath, VersionLockContent content) → void
Write lock content to a file atomically.

Exceptions / Errors

StallTimeoutError
Error thrown when a download stalls (no data received for timeout period).