Автоматично обновяване
Модулът updater/ осигурява автоматични обновления чрез GitHub Releases с SHA256 верификация и механизъм за безопасен rollback. При инсталация от Microsoft Store (MSIX), auto-updater-ът е деактивиран -- Store-ът се грижи за обновленията.
Поток на обновяването
Компоненти
github.rs -- GitHub Releases API
Извлича последния release от GitHub:
pub struct Release {
pub tag_name: String, // напр. "v0.2.0"
pub assets: Vec<Asset>,
}
pub struct Asset {
pub name: String,
pub size: u64,
pub browser_download_url: String,
pub digest: Option<String>, // "sha256:abcdef..."
}
| Параметър | Стойност |
|---|---|
| Timeout | 10 секунди |
| Retries | 1 (при connection/timeout грешка, 2s delay) |
| User-Agent | dictaro-client |
| Rate limit | Обработва 403 (GitHub rate limit) |
Версионно сравнение: Използва semver crate за парсване и сравнение на версии. Tag-ът може да има v prefix (напр. v0.2.0).
download.rs -- Download + SHA256 верификация
| Параметър | Стойност |
|---|---|
| Download timeout | 300 секунди (5 минути) |
| Buffer size | 8192 bytes |
| Digest format | sha256:<hex> (GitHub asset digest) |
| Intermediate file | dictaro-client.exe.tmp |
| Final file | dictaro-client.exe.new |
swap.rs -- Self-Replace + Rollback
Прилагане на обновление (при стартиране)
Файлова конвенция
| Файл | Роля |
|---|---|
dictaro-client.exe | Текущ изпълним файл |
dictaro-client.exe.new | Свален нов exe, чакащ прилагане |
dictaro-client.exe.old | Backup на предишния exe (създаден от self-replace) |
dictaro-client.exe.tmp | Временен файл при download |
.update_ok | Sentinel файл -- маркира успешно стартиране след обновление |
Sentinel механизъм за безопасност
MSIX детекция
pub fn is_msix_packaged() -> bool {
let result = GetCurrentPackageFullName(&mut length, null_mut());
// APPMODEL_ERROR_NO_PACKAGE (15700) = NOT packaged
result != 15700
}
Когато приложението е инсталирано от Microsoft Store:
is_msix_packaged()връщаtrue- GitHub auto-updater-ът се пропуска
- Store-ът управлява обновленията автоматично
- Логва се: "Running as MSIX package -- skipping GitHub updater"
Repository
Releases се публикуват в GitHub repository djok/whisper-keyboard-releases. Текущата версия се взима от Cargo.toml чрез env!("CARGO_PKG_VERSION").