system auth

updateService

updateService

src/main/services/update.service.ts


Для чого це

Автоматично перевіряє наявність нових версій і дає оператору оновитись без ручного завантаження. Підтримує Windows (.exe) і macOS (.dmg).


Перевірка оновлень

Автоматично — кожні 15 хвилин через setInterval (на відміну від інших сервісів — не ourSetTimeout).

ВручнуcheckForUpdates(isForce: true) на кроці Login (крок 2).

Перед кожною перевіркою → cleanupOldInstallers() — видаляє старі .exe/.dmg з temp директорії (паттерн: golden-bride-app-*-win-x64.exe і golden-bride-app-*-mac-universal.dmg).


Два режими при знайденому оновленні

isForce: false (автоматична перевірка)

Показує dialog.showMessageBox — не блокуючий діалог:

  • Версія нового релізу
  • Release notes
  • Текст “перезапустіть коли зручно”
  • Кнопка “Зрозуміло”

isForce: true (при логіні)

Запускає повний флоу завантаження і встановлення.


Флоу завантаження (force)

  1. Платформа і шлях:

    • Windows: temp/golden-bride-app-{version}-win-x64.exe
    • macOS: temp/golden-bride-app-{version}-mac-universal.dmg
  2. createUpdateWindow() — BrowserWindow 600×400, closable: false, з HTML-інтерфейсом:

    • Поточна і нова версія
    • Release notes (скрол)
    • Кнопка “Почати оновлення”
    • Після кліку — прогрес-бар
  3. waitForUserConfirmation() — чекає клік на кнопку через IPC (start-update-download)

  4. stackService.downloadUpdateWithProgress(platform, arch, path, progressCallback) — завантаження з відображенням відсотка у вікні через update-progress IPC

  5. validateInstallerFile(path, platform) — перевірки:

    • Файл існує
    • Розмір ≥ 50 MB (Win) або ≥ 100 MB (Mac) — захист від неповного завантаження
    • Windows: перші 2 байти = MZ (заголовок PE executable)
  6. Встановлення — платформо-специфічно


Встановлення Windows

spawn(installer, ['/S'], { detached: true, stdio: 'ignore', windowsHide: true })

  • /S — тихий режим (без UI інсталятора)
  • detached: true + unref() — інсталятор живе після app.quit()
  • Timeout 5 сек на spawn — якщо не відповів → вважаємо що запустився
  • При помилці spawn → fallback через exec з shell: true
  • Після spawn → app.quit()

Встановлення macOS

Bash-скрипт що виконується у фоні:

  1. hdiutil imageinfo — перевірка валідності DMG
  2. hdiutil attach -nobrowse -mountrandom /tmp — монтування
  3. Знаходить .app в змонтованому DMG
  4. sleep 3 — чекає закриття поточного додатку
  5. rm -rf oldAppcp -R newApp
  6. chmod -R 755 — права доступу
  7. hdiutil detach — розмонтовує DMG
  8. open appPath — запускає нову версію
  9. Скрипт самовидаляється

Лог скрипту записується в temp/update_log.txt для діагностики.


Нюанси

  • Вікно оновлення closable: false — не дозволяє закрити під час завантаження
  • macOS: вікно alwaysOnTop: true, на Windows — модальне з parent: mainWindow
  • stop() — очищає setInterval перевірок при логауті
  • При помилці завантаження — dialog.showMessageBox з текстом помилки